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好吧,如果导出是names
func1
,那么我会相信它实际上不是u stdcall。我将在几分钟内删除我的无效答案。导出文件中的语法看起来不正确。请检查dumpbin.exe以确保。通常,每一行只需要包含您希望函数具有的名称(例如
func1
),链接器将自行确定详细信息。