您的位置:首页 > 其它

关于用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: