Windows __stdcall没有任何装饰
我有一个Windows __stdcall没有任何装饰,windows,dll,calling-convention,build-tools,stdcall,Windows,Dll,Calling Convention,Build Tools,Stdcall,我有一个.dll我怀疑它使用了\uu stdcall函数,但名称完全没有修饰(甚至没有下划线或@符号)。我为它写了一个.def文件,别名如下 func1 = func1 func1@4 = func1 但是我认为lib(我使用它从.def文件创建导入库)忽略了别名(链接器仍然说func1@4未定义) 如何创建映射func1@4 >代码>函数1> />代码> ,您应该声明函数原型为“外部”c(显然)以C++模式编译: extern "C" void func1(void); // correc
.dll
我怀疑它使用了\uu stdcall
函数,但名称完全没有修饰(甚至没有下划线或@
符号)。我为它写了一个.def
文件,别名如下
func1 = func1
func1@4 = func1
但是我认为lib
(我使用它从.def
文件创建导入库)忽略了别名(链接器仍然说func1@4
未定义)
如何创建映射
func1@4<代码> >代码>函数1> />代码> ,您应该声明函数原型为“外部”c(显然)以C++模式编译:
extern "C" void func1(void); // correct prototype, add __stdcall if necessary?
您可以将头文件的整个部分包装在
extern "C" {
// ... C compatible declarations
}
我不知道是否可以使用lib.exe
创建正确的.lib
文件,因此我建议使用原始DLL导出的函数存根创建一个DLL
示例dll.cpp
文件:
void __stdcall foo(int) {}
EXPORTS
foo=foo
dll.def
文件:
void __stdcall foo(int) {}
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);
}
我正在使用extern“c”
。它自己将其更改为\uu cdecl
。当我添加\uu stdcall
时,我添加了一个@
。@baruch也许你可以给我们看一下代码。FWIW,我认为问题不在def中file@baruch那么。。。试试其他代码?引用“链接器说func1@4是未定义的“即,问题在您的代码中。您指的是func1@4
而不是func1
,因此您的标题——错误——与lib不匹配,这就是问题所在?我如何告诉它func1
应该链接为func1
,但仍然使用u stdcall约定?@baruch好吧,如果导出是namesfunc1
,那么我会相信它实际上不是u stdcall。我将在几分钟内删除我的无效答案。导出文件中的语法看起来不正确。请检查dumpbin.exe以确保。通常,每一行只需要包含您希望函数具有的名称(例如func1
),链接器将自行确定详细信息。