关于Dll的创建和动态联接的若干问题.
我自己创建了一个非常简单的dll文件,dll中采用如下几种声明方式:
extern "C" _declspec(dllexport) int add(int x,int y) (1)
采用以上声明方式在测试程序中可以通过LoadLibrary动态联接调用,无误.
当采用_declspec(dllexport) int add(int x,int y) (2)声明方式,
调用不成功,返回的函数地址为NULL.
当采用extern "C" _declspec(dllexport) int WINAPI add(int x,int y) (3)
函数调用同样不成功.
不知道这都是为什么,我看书上还有其他一些地方,都采用
extern "C" _declspec(dllexport) void WINAPI Func(参数表)
似乎不会有任何问题,我怎么就碰到这么多问题呢?
我使用vc建立的测试程序.采用typedef int (_cdecl* pFunc)(int a,int b)当采用(1)方式声明的时候,调用就成功.
测试程序中typedef int (WINAPI* pFunc)(int a,int b),而dll中采用(3)的时候调用还是不成功.最不明白的就是这个了.
还有(2)也不明白,为什么少了extern "C"也不行呢,我可使用vc建立的调试程序阿.
还有,除了声明的时候要用到那一堆前缀外,是不是在实现函数的时候也要加上那些前缀呢?
我试着在一个dll的类中添加了一个public成员函数,然后在那个类的.h文件中加上那些前缀试图做成导出函数的时候,在classview中那个成员函数消失了,这意味着什么问题吗?
vc写的dll缺省采用_cdecl,这样生成的dll可以在Dephi、vb这样的程序中调用吗?
要想在dll的调用程序中传递一些字符串给dll得导出函数,那么导出函数的参数可以使用CString的LPCTSTR吗或者说可以采用CString吗?怎么实现?
初学dll编程,有这么一大队问题,看了不少dll的论述,觉得在实际的开发中还是存在这么多问题,还是不很明白.
谢谢各位进来的大哥大姐了!!要是大家还有什么关于dll的问题,也一并在这里问好了
问题点数:100、回复次数:8Top
1 楼hotzhu(天下无妞)回复于 2003-03-03 20:52:40 得分 30
extern "C" 应该是防止编译器将函数名上加入别的字符,如果不用extern "C"你就在DLL中找不到编程时书写的函数了.Top
2 楼demetry(智者橡木)回复于 2003-03-04 01:16:01 得分 20
不知道为什么,很少有人愿意写.def。其实写一个.def文件,就会省很多麻烦!Top
3 楼ttzzgg_80713(身无立锥地,常有四海心---老子有条命)回复于 2003-03-04 01:18:16 得分 10
我喜欢写defTop
4 楼sniper81(菜鸟也是人)回复于 2003-03-04 10:14:19 得分 0
写.def就可以省去所有那些前缀了吗?Top
5 楼sniper81(菜鸟也是人)回复于 2003-03-06 14:34:10 得分 0
why没人说话,只好自己顶顶了~~~ :(
还有,怎么向dll中传递字符串变量,并从dll中通过参数返回一个字符串?我使用MFC的非扩展dll,参数选用LPSTR,不止有没有不妥之处。Top
6 楼yndfcd(YNDFCD)回复于 2003-03-06 20:50:51 得分 20
有很多语言并不支持__cdecl的调用转换,所以要想DLL能被更多的语言使用权用最好用__stdcall,但是如果函数中有可变个参数则必须用__cdecl,这也是C语言中默认的转换方式。WINAPI在不同的环境下定义是不一样的,最好声明成__stdcall不要用WINAPI.
向dll中的函数传入字符或从中返回字符串与在一般函数中没有什么区别。Top
7 楼wenj(文子)回复于 2003-03-06 21:21:22 得分 20
编辑器会将函数名改变,如int add(int x,int y),编辑后会变成int ??_add(int,int),具体怎么变,我不记得了,这样你调用是当然找不到add()了。 用extern "C",就是告诉编辑器,编辑时,保证函数名不变。用*.def文件也可以决定输出的函数名。
Top
8 楼sniper81(菜鸟也是人)回复于 2003-03-07 16:37:20 得分 0
嗯,那些问题我已经自己解决了,谢谢楼上几位。
还有一个问题,导出函数必须是全局函数吗?不可以是dll内某个类的public属性的函数吗?好像一在那些类的Public属性的函数声明前加上导出函数的前缀,那个函数就会在ClassView中消失~不知道这有事没事。Top




