关于用c生成的dll在使用其他供应商的工具创建可执行模块时遇到的一些问题
2007-04-29 01:35
961 查看
本文作者:Closeall
本文出处:http://blog.csdn.net/closeall2008
声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章的作者, 出处以及声明信息. 谢谢.
去年晚些时候,写过一个简单的网络更新程序。客户端的程序界面要想用VC把它做漂亮些,确实有些繁琐。这些天想把它改写一下,就是用C 把客户端的通信模块做成一个dll,然后其它的编程环境来做界面,通信的时候,让其调用用c写的那个dll即可。但这里涉及到了一些小问题——如果使用visual C++创建dll,而这个dll要链接到使用任何供应商的工具创建的可执行模块,那么必须要做一些额外的工作。
我们都知道在使用c和 c++进行混合编程的时候,需要使用extern "C"来解决修改符的问题。 如何用c写一个dll,而用第三方工具创建可执行模块的时候也会同样出现类似修改函数名符号的问题。当你使用__stdcall将c函数输出的时候,Microsoft的编辑器就会修改函数的名字,设置一个前导下划线,再加上一个@符号的前缀,后随一个数字,用于表示作为参数传递给函数的字节数。
例如: 下面的函数是作为dll的输出字节的_dllfunction@4输出的。其中那个数字4表示参数的字节数。
__declspec(dllexport) long __stdcall dllfunction( int x )
如果用另一个供应商提供的工具在创建可执行模块的时候,他将设法链接到一个名为dllfunction的函数,该函数在Microsoft的编译器已有的dll中并不存在,因为它的输出名为_dllfunction@4,因此链接将会失败。
如果想使用第三方供应商提供的工具创建一个可执行模块,你必须要告诉Microsoft的编译器在输出的时候输出没有经过改变的函数名。如何告诉Microsoft的编译器呢?有两种方法可以解决这个问题。
第一、在编写一个dll项目的时候, 创建一个.def文件,并在.def文件中加上类似于下面的EXPORTS节:
EXPORTS DLLFUNCTION
进行这样的操作后,当Microsoft的连接器在分析.def这个文件时,他会发现_dllfunction@4和 dllfunction 两个函数名均被输出,由于着两个函数名是互相匹配的,因此链接程序会使用dllfunction的.def文件名输出这个函数,这样就会解决这个问题。
第二、可以不使用.def这个文件。在dll的源代码文件中,你可以添加下面这行代码:
#pragma comment ( linker, "/export:dllfunction=_dllfunction@4" )
(全文完)
译者;closeall
时间:2007.04 29
本文出处:http://blog.csdn.net/closeall2008
声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章的作者, 出处以及声明信息. 谢谢.
去年晚些时候,写过一个简单的网络更新程序。客户端的程序界面要想用VC把它做漂亮些,确实有些繁琐。这些天想把它改写一下,就是用C 把客户端的通信模块做成一个dll,然后其它的编程环境来做界面,通信的时候,让其调用用c写的那个dll即可。但这里涉及到了一些小问题——如果使用visual C++创建dll,而这个dll要链接到使用任何供应商的工具创建的可执行模块,那么必须要做一些额外的工作。
我们都知道在使用c和 c++进行混合编程的时候,需要使用extern "C"来解决修改符的问题。 如何用c写一个dll,而用第三方工具创建可执行模块的时候也会同样出现类似修改函数名符号的问题。当你使用__stdcall将c函数输出的时候,Microsoft的编辑器就会修改函数的名字,设置一个前导下划线,再加上一个@符号的前缀,后随一个数字,用于表示作为参数传递给函数的字节数。
例如: 下面的函数是作为dll的输出字节的_dllfunction@4输出的。其中那个数字4表示参数的字节数。
__declspec(dllexport) long __stdcall dllfunction( int x )
如果用另一个供应商提供的工具在创建可执行模块的时候,他将设法链接到一个名为dllfunction的函数,该函数在Microsoft的编译器已有的dll中并不存在,因为它的输出名为_dllfunction@4,因此链接将会失败。
如果想使用第三方供应商提供的工具创建一个可执行模块,你必须要告诉Microsoft的编译器在输出的时候输出没有经过改变的函数名。如何告诉Microsoft的编译器呢?有两种方法可以解决这个问题。
第一、在编写一个dll项目的时候, 创建一个.def文件,并在.def文件中加上类似于下面的EXPORTS节:
EXPORTS DLLFUNCTION
进行这样的操作后,当Microsoft的连接器在分析.def这个文件时,他会发现_dllfunction@4和 dllfunction 两个函数名均被输出,由于着两个函数名是互相匹配的,因此链接程序会使用dllfunction的.def文件名输出这个函数,这样就会解决这个问题。
第二、可以不使用.def这个文件。在dll的源代码文件中,你可以添加下面这行代码:
#pragma comment ( linker, "/export:dllfunction=_dllfunction@4" )
(全文完)
译者;closeall
时间:2007.04 29
相关文章推荐
- 关于VS 使用GDB工具调试ADT下JNI时遇到的一些问题的解决
- 关于Unity项目中创建项目遇到的一些问题
- 关于Handler使用遇到的问题--多执行了些循环。
- 关于使用百度地图过程中遇到的一些问题(一)
- Qt5中创建及使用自定义插件遇到的一些问题
- 关于Oracle字段类型Date使用mybatis generator自动生成工具出现的查询日期只精确到年月日问题
- 今天使用VS2012遇到一个问题:"链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的"
- 使用自动生成Mipmap时遇到的一些问题
- 使用autogen工具生成Makefile遇到问题解决思路
- 向自己的模块添加错误代码_使用vc自带的工具MC创建资源并将其添加至DLL或EXE中
- 关于VS2005生成页面遇到的一些问题
- 刚才遇到了关于C#使用外部DLL函数上的char*的问题。
- 关于使用性能测试工具的一些想法和问题
- [转]关于创建dll项目无法生成对应Lib文件的问题
- 在安装并使用tensorflow中的Object-detection模块时遇到的一些问题汇总及解决方法
- 使用lib.exe工具和.def .dll文件生成.lib文件时遇到 无法打开*.lib文件
- 关于使用vc++调用matlab生成的dll传递数组的问题
- 关于Android Studio使用SVN遇到的一些问题
- 关于SpringMVC4使用过程中的路径问题,我们经常遇到的Controller未执行以及执行了之后出现404
- 关于android 代码生成布局中遇到的一些问题