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
这里我再补充说一下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
来自 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
《VC技术内幕》中的
typedef int (__stdcall f1)(int, int);
语法似乎是不对的。至少在我的VC6中无法编译。(它想声明一种函数类型,然后再声明一个这种类型的指针)
clq
如果此工程中只有一个DLL,DEF文件可简化为如下内容:
EXPORTS
Add
Sub
非常的简单。
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.