您的位置:首页 > 其它

Windows dll编写与def文件

2009-02-08 16:18 801 查看
问题1:

查看一个编写的dll的输出,函数名老是 _xxxx@n之类,已经使用了extern "C"并工程中添加了def文件。在“问专家”中搜索到这么一段:

在VC++中,如果生成DLL可以不使用.def文件。你只需要在VC++的函数定义前要加
__declspec(dllexport)修饰就可以了。但是使用__declspec(dllexport)和使用.def文件是有区别的。如果你的
DLL是提供给VC++用户使用的,你只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果你的DLL是供VB、
PB、Delphi用户使用的,那么会产生一个小麻烦。因为VC++对于__declspec(dllexport)声明的函数会进行名称转换,如下面的
函数:

__declspec(dllexport) int __stdcall IsWinNT()

会转换为IsWinNT@0,这样你在VB中必须这样声明:

Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long

@的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。

EXPORTS后面的数可以不给,系统会自动分配一个数。对于VB、PB、Delphi用户,通常使用按名称进行调用的方式,这个数关系不大,但是对于使用.lib链接的VC程序来说,不是按名称进行调用,而是按照这个数进行调用的,所以最好给出。

看来是def文件没起到作用。最终发现需要将def文件配置到VC工程中的“链接器”的“模块定义文件”中。

问题2:

在def中增加几个输出函数定义后(这些函数本来已经输出,但没有加到def文件中),发现某些以前编译的程序执行报错找不着函数,但其他一些程序没有报错。看来报错的程序连接时没有使用lib文件,而没报错的使用了;没使用lib文件的通过hint定位函数,所以总能找到但可能找错了——难怪听说这个库以前发生过函数调错的现象。

增加了输出函数却忘了在def中增加定义,新手写的代码又无人检查,最严重的是后期的版本问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: