CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

关于Dll的创建和动态联接的若干问题.

楼主sniper81(菜鸟也是人)2003-03-03 20:48:51 在 VC/MFC / 进程/线程/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

相关问题

  • 动态加载Dll后动态创建对象!!!!
  • Dll 方面的用类,如何创建和动态调用
  • 动态创建......
  • 关于数据库的动态联接
  • 动态创建TQuery
  • 创建动态datawindow
  • 动态创建表
  • 在Dll里面动态创建菜单,如何把单击事件的回调函数写在Dll里面?
  • vclSkin给通过Dll动态创建的窗体换肤的问题,请有过相关经验的赐教!
  • 在DLL中动态创建的按钮为什么得不到它的名字呢???sender是空值????

关键词

  • 函数
  • dll
  • 文件
  • 测试
  • 语言
  • vc
  • 调用
  • 导出
  • 前缀
  • 字符串

得分解答快速导航

  • 帖主:sniper81
  • hotzhu
  • demetry
  • ttzzgg_80713
  • yndfcd
  • wenj

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo