如何从DLL文件中导出LIB文件.docVIP

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

如何从DLL文件中导出LIB文件? (2008-05-02 12:49:04) 标签:杂谈? 分类:程序人生 由于我们经常要调用一些第三方厂商或其他编译器编写的动态链接库,但是一般都不提供源文件或.lib文件,而作为VC隐式链接到DLL (implicitly ? link ? to ? the ? DLL)调用,这些却是必需的。本文将主要讨论在没有源文件及.lib输入库文件或欲调用Windows未公开函数的情况下重建.Lib文件的方法。在建立之前,我们首先要了解一下DLL输出函数的几种方式。 ? ? ? 一、从DLL中输出函数的方式(calling ? conventions) ? ? ? _cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。 ? ? ? _stdcall是Pascal程序的缺省调用方式,通常用于Win32 ? Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上@和参数的字节数。 ? ? ? _fastcall方式的函数采用寄存器传递参数,VC将函数编译后会在函数名前面加上@前缀,在函数名后加上@和参数的字节数。 ? ? ? 用VC建立一个空的动态链接库,并加入以下三个文件: ? ? ? //noname.h ? ? 动态链接库头文件 ? ? ? extern ? C ? void ? _stdcall ? ? stdcallproc(void); ? ? ? extern ? C ? void ? ? _cdecl ? cdeclproc(void); ? ? ? extern ? C ? void ? ? _fastcall ? fastcallproc(void); ? ? ? //noname.cpp ? ? ? 动态链接库实现文件 ? ? ? #include ? windows.h ? ? ? extern ? C ? void ? _stdcall ? ? stdcallproc(void) ? ? ? { ? MessageBox(0,stdcall ? function,dll ? call,0); ? ? ? } ? ? ? extern ? C ? void ? ? _cdecl ? cdeclproc(void) ? ? ? { ? MessageBox(0,cdecl ? function ? ,dll ? call,0); ? ? ? } ? ? ? extern ? C ? void ? ? _fastcall ? fastcallproc(void) ? ? ? { ? MessageBox(0,fastcall ? function ? ,dll ? call,0); ? ? ? } ? ? ? //noname.def ? ? 动态链接库输出函数定义 ? ? ? LIBRARY ? ? ? ? ? ? noname ? ? ? EXPORTS ? ? ? stdcallproc ? @1 ? noname ? ? ? cdeclproc ? ? @2 ? ? ? fastcallproc ? @3 ? ? ? 编译后生成noname.lib,输出函数_cdeclproc,_stdcallproc@0,@fastcallproc@0;生成的 noname.dll在Exescope等PE格式的工具中只能看到cdeclproc和fastcallproc函数,因为stdcallproc被指定noname属性,没有名字输出,类似于Windows未公开函数。 ? ? ? 二、可执行程序调用DLL的方式 ? ? ? 可执行程序可以采用隐式链接(implicit ? linking)或显式链接(explicit ? linking)两种方式调用一个DLL。 ? ? ? 使用显式链接时,使用DLL的程序在使用之前必须加载(LoadLibrary)加载DLL从而得到一个DLL模块的句柄,然后调用 GetProcAddress函数得到输出函数的指针,在退出之前必须卸载DLL(FreeLibrary),因为不是本文重点,具体例程请参考有关文档。显然,在调用大量的函数时这种方法会很不方便。 ? ? ? 使用隐式链接时,可执行程序链接到一个包含DLL输出函数信息的输入库文件(.LIB文件)。操作系统在加载使用可执行程序时加载DLL。可执行程序直接通过函数名调用DLL的输出函数,调用方法和程序内部其他的函数是一样的。 ? ? ? 三、重建.Lib输入库文件 ? ? ?

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档