c动态链接库.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c动态链接库

c动态链接库 用VC编写DLL教程 用Visual Sudio 6.0新建一个工程,工程的类型选择Win32 Dynamic-Link Library.工程名任意,其他所有选项取默认 新建一个cpp文件,代码如下: int add(int a ,int b){ return a+b; } 如果工程类型是Win32 Console Application,那么在编译链接以后,会产生一个Debug目录,并且里面有一个exe文件 这里我们的工程类型是Win32 Dynamic-Link Library,在编译链接以后,我们期望产生一个Debug目录,并且里面有一个dll文件 事实正是如此 我们可以用depends工具打开这个dll文件以查看它导出了什么函数 depends工具在Tools菜单下.实际上它是D:\Program Files\Microsoft Visual Studio\Common\Tools下的一个文件 我们发现,这个dll没有导出任何东西 这是因为我们并没有说明我们要导出的东西.在那个cpp里的函数并不是默认会被导出的.因为它们可能只是被我们要导出的函数的调用的内部函数. 要导出一个函数,我们须要加上_declspec(dllexport),代码变为: int _declspec(dllexport) add(int a ,int b){ return a+b; } 再链接一次 再查看该dll文件,发现有一个?add@@YAHHH@Z的函数.好像很怪,不过总算看到东西了 现在来测试一下这个dll 新建一个工程,类型选Win32 Console Application 新建一个cpp文件,代码如下 #include iostream.h #include Windows.h void main(){ typedef int (*ADD)(int ,int);//函数指针类型 HINSTANCE Hint = ::LoadLibrary(DLL.dll);//加载我们刚才生成的dll ADD add = (ADD)GetProcAddress(Hint,add);//取得dll导出的add方法 coutadd(3,4)endl; } 其中LoadLibrary都是Windows.h里面声明了的函数 编译链接,都没问题 运行.出错了! 分析一下,程序怎么知道去哪里找我们的dll呢? 它会按如下顺序搜索:当前可执行模块所在的目录,当前目录, Windows 系统目录,Windows 目录。GetWindowsDirectory 函数检索此目录的路径,PATH 环境变量中列出的目录。 所以我们要把我们的dll复制一份到这个测试工程的Debug目录之后,再运行 还是出错了! 分析一下.我们刚才看到的是一个叫?add@@YAHHH@Z函数.那么,是不是这个原因呢? 把代码改为: #include iostream.h #include Windows.h void main(){ typedef int (*ADD)(int ,int);//函数指针类型 HINSTANCE Hint = ::LoadLibrary(DLL.dll);//加载我们刚才生成的dll ADD add = (ADD)GetProcAddress(Hint,?add@@YAHHH@Z);//取得dll导出的add方法 coutadd(3,4)endl; } 再编译链接,运行,成功了! 那么怎么可以正确导出我们函数的名字呢? 在生成dll的工程的代码加上extern C,改为: extern C int _declspec(dllexport) add(int a ,int b)...{ return a+b; } 编译链接后,查看dll文件,可以看到导出的函数变为add了 这时下面代码可以正常工作了 #include iostream.h #include Windows.h void main()...{ typedef int (*ADD)(int ,int);//函数指针类型 HINSTANCE Hint = ::LoadLibrary(DLL.dll);//加载我们刚才生成的dll ADD add = (ADD)GetProcAddress(Hint,add);//取得dll导出的add方法 coutadd(3,4)endl; } 除了用_declspec(dllexport)指明要导出的函数,用extern C来纠正名字,我们还可用一个.def文件来达到以上目的 在dll工程里新建一个文件,类型选Text File,在名字要带上后缀.def 内容如下: LIBRARY EXPORTS add 剩下的步骤就和之前一样了 用def文件还可以改变导

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档