2011-11-03 45 views
4

我试图建立C语言编写的一个dll并且将被其它程序也用C写的不能阻止名称重整

在导入所以被定义的所有DLL是否导出功能。 dll “without __declspec(dllexport)”(故意)。我已经用一个导出部分定义了一个.def文件,并且我想要导出的函数的名称(未加密的名称)。

我正在使用vc71/vs2003来构建这个,而且我仍然遇到了重名(如果我在记事本中打开.lib,我可以看到)。也只是为了澄清,visual studio导致在C代码中的名称变形(我能找到的大多数资源都提到它只是C++的一个问题)。

我该如何防止这个名称被破坏?

更多信息:

的错位的名称的形式为“functionName @整数”,其中整数表示以字节为单位的参数大小(而不是有序)的。例如,

来自的.lib: _PrepareSeverResponse @ 8

函数声明中.H: 字符* PrepareSeverResponse(无符号整数*尺寸,握手* ws_handshake);

.DEF: EXPORTS PrepareSeverResponse

调用约定: __stdcall(/ GZ)

希望这是更清晰。

+0

你的意思是在C++的意义上(如神秘回答)有很多问号和其他符号的损坏名称?或者你的意思是因为它是_Name @ 16格式而受到损坏?您检查.lib,但.lib可能具有从名称到序号的映射。你应该使用walker来检查DLL,看看函数的名字是什么。发布您的.def文件也可能有所帮助。 – tinman

+0

不要将.def文件内容和*确切*损坏的名称保密。 –

+2

你的通话习惯是什么?它是'cdecl'吗? –

回答

5

更改调用约定为cdecl为我工作。外部的“C”解决方案对我来说没有多大的帮助,因为在我的情况下,问题是在编译时发生名称混乱。C文件,就好像我正确理解的那样,extern“C”解决方案用于在编译cpp文件时抑制名称变形。

2

为了防止名字改编,你需要extern C来包装你的头:

#ifdef __cplusplus 
extern "C" { 
#endif 


// Headers 


#ifdef __cplusplus 
} 
#endif 

这将迫使符号的C型(未重整)的名字。

+2

试过这个,没有工作。即使在我的.h文件中生成这个.lib文件后,仍然存在着错误的定义。 –

+1

在你定义它们之前,你是否包含了标题*? – Mysticial

0

没有看到你正在表征为“name-mangling”,我想你必须将Visual Studio设置为Compile as C Code (/TC)

它在Properties->C/C++->Advanced->Compile As。您可以为整个项目选择此设置,因为这是您的意图。

2

你看到的名字与C++无关;它是微软的调用约定name decoration,并且也适用于C代码。您可以在DEF文件alias these names回:

EXPORTS 
    [email protected] 
    [email protected] 

注意,当你链接您的库到另一个程序,主机程序将寻找修饰名。您可能需要一个未装饰名称的主要情况是,如果您希望用户使用LoadLibraryGetProcAddress加载您的DLL。