登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: 在VC中不用MFC如何制作dll     [回主站]     [分站链接]
标题
在VC中不用MFC如何制作dll
clq
浏览(0) + 2004-10-06 13:44:37 发表 编辑

关键字:

来自 http://ir.hit.edu.cn/cgi-bin/newbbs/topic.cgi?forum=11&topic=108&show=0
另外这里还有一些特别的文章
------------------------------------------------------------------------------------------
方法一:使用export 和 import

在VC中建立一个Console Application,建立2个文件:Dll.h 和 Dll.cpp

Dll.h

#ifdef MYLIBAPI
#else
#define MYLIBAPI extern "C" _declspec (dllimport)
#endif

MYLIBAPI int Add (int iLeft, int iRight);
MYLIBAPI int Sub (int iLeft, int iRight);

Dll.cpp

#define MYLIBAPI extern "C" _declspec (dllexport)

#include "Dll.h"

int Add (int iLeft, int iRight)
{
  return iLeft + iRight ;
}

int Sub (int iLeft, int iRight)
{
  return iLeft - iRight ;
}

保存文件。
在Project->setting->link 最下面加上 “/dll”, "/"之前一定要与前一项
有空格。
然后编译,就可以在debug 或 release下面找到dll 和 lib 文件了
使用的时候包含dll.h文件

方法二:使用def文件
建立一个console application, 建立2个文件dll.h 和 dll.cpp

Dll.h

int Add (int iLeft, int iRight) ;
int Sub (int iLeft, int iRight) ;

Dll.cpp

#include "Dll.h"

int Add (int iLeft, int iRight)
{
  return iLeft + iRight ;
}

int Sub (int iLeft, int iRight)
{
  return iLeft - iRight ;
}

然后再当前目录下面建立一个.def文件,文件名最好和要输出的dll名字一样,扩展名
为.def, 里面写上:

LIBRARY dllname.dll
EXPORTS
Add @1
Add @2
然后将这个文件添加到工程中,
在link中设置 /dll, 然后编译
在debug或release中就可以找到dll和lib了
使用的时候加上dll.h文件

参考文献:

《Windows核心编程》

《凌波微步-软件开发警戒案例集》

clq
2004-10-6 16:10:55 发表 编辑

这里我再补充说一下DLL的调用。按上面的说法,只要将*.h,*.lib文件放到另外程序的目录下就可以象调用一个普通的库一样用了。但大多数情况下DLL是没有这些附加的文件的,所以有时候还是用标准的windows的调用方法好一些。此方法对于所有的开发语言都是一样的,比如Delphi。

---------------------------------
首先为了能让所有的程序都使用DLL中的函数,请在上文中的所有函数名前加上"__stdcall"(注意是两个下划线,而不是一个)。这时候(似乎?)是只能用DEF的导出方式。为什么?不清楚,在 http://www.china-askpro.com/msg25/qa54.shtml 有一些说明。不过用DEF文件本身就更简单,用用也好。生成DLL后可用以下代码调用:
     typedef int (__stdcall *f1)(int, int);

     f1 f2;
     HINSTANCE h1 = ::LoadLibrary("dll.dll");
     f2 = (f1)::GetProcAddress(h1,"Add");
     int i1 = (* f2)(1,2);
大家可以看到,其实就是函数指针操作。这些代码可以翻译为Delphi等语言。

clq
2004-10-6 16:12:15 发表 编辑

来自 http://www.china-askpro.com/msg25/qa54.shtml
-------------------------------------------------------
如何实现Delphi与VC++之间的函数共享


编号:QA002454
建立日期: 2000年1月18日 最后修改日期:2000年1月18日
所属类别:
C/C++ - 其他方面

Delphi - 其他方面


tzx:
  编程工具: Delphi,VC++
  操作系统: windows9x,NT
  问题:如何实现Delphi与VC++之间的函数共享,即PASCAL与C语言之间如何定义函数接口,如何调用。

回答:

  你可以使用VC++编写DLL供Delphi调用,或者反过来。直接链接.obj是不行的,因为两者的格式不同。
  VC++和Delphi都支持Pascal和C语言两种调用协定。
  如果使用Pascal协定,VC++的函数定义前要加_stdcall修饰(stdcall是Windows的标准调用方式,可以在所有支持API调用的语言中使用),并且需要在.DEF文件中的EXPORTS端中加入函数名。参考QA000072 "VB和VC混合编程"。在Delphi定义时要在函数名后加stdcall修饰(参见帮助)。
  如果使用C协定,VC++的函数定义前要加__declspec(dllexport)修饰,不需要再修改.DEF文件了。在Delphi定义时要在函数名后加cdecl修饰(参见帮助)。

此问题由李海回答。

clq
2004-10-6 16:17:50 发表 编辑

《VC技术内幕》中的
typedef int (__stdcall f1)(int, int);
语法似乎是不对的。至少在我的VC6中无法编译。(它想声明一种函数类型,然后再声明一个这种类型的指针)

clq
2004-10-6 16:19:56 发表 编辑

如果此工程中只有一个DLL,DEF文件可简化为如下内容:
EXPORTS
Add
Sub
非常的简单。


总数:4 页次:1/1 首页 尾页  
总数:4 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1