__stdcall没有任何装饰

问题描述:

我有一个.dll我怀疑使用__stdcall函数,但完全未装饰的名称(甚至没有下划线或@符号)。我写了一个.def文件它的别名一样__stdcall没有任何装饰

func1 = func1 
[email protected] = func1 

但我认为lib(这我使用创建一个从.def文件导入库)被忽略别名(链接器还称[email protected]是不确定的)

如何创建将[email protected]映射到func1的导入库?

+0

导出文件中的语法看起来不正确。请确保使用dumpbin.exe进行检查。通常每行只需要包含你希望函数具有的名称(例如'func1'),链接器将自己弄清楚细节。 – 2015-09-02 12:06:55

你应该在声明函数原型为extern“C”为你(显然)编译在C++模式:

extern "C" void func1(void); // correct prototype, add __stdcall if necessary? 

你可以用里面

extern "C" { 
    // ... C compatible declarations 
} 
头文件的整个部分
+0

我正在使用'extern“c”'。它自己将其更改为'__cdecl'。当我添加'__stdcall'时,我添加了一个'@'。 – baruch 2012-03-26 10:44:07

+0

@baruch也许你可以给我们看看代码。 FWIW,我不认为问题在于def文件 – sehe 2012-03-26 10:47:28

+0

哪个代码?我没有dll的来源。 – baruch 2012-03-26 10:55:34

我不知道是否有可能使用lib.exe创建正确的.lib文件,所以我建议用原始DLL导出的函数的存根创建一个DLL。

dll.cpp文件:

void __stdcall foo(int) {} 

dll.def文件:

EXPORTS 
foo=foo 

然后你编译它,从IDE或命令行:

cl dll.cpp /link /dll /def:dll.def /noentry 

这将创建正确dll.lib文件,所以你可以使用这样的代码:

void __stdcall foo(int); 
#pragma comment(lib, "dll") 
int main() 
{ 
    foo(42); 
}