__stdcall没有任何装饰

时间:2012-03-26 10:34:13

标签: windows dll calling-convention build-tools stdcall

我有一个.dll我怀疑使用__stdcall个函数,但完全未修饰的名称(甚至不是下划线或@符号)。我为它写了一个.def文件,其中包含

等别名
func1 = func1
func1@4 = func1

但我认为lib(我用它来创建.def文件中的导入库)忽略了别名(链接器仍然说func1@4未定义)

如何创建将func1@4映射到func1的导入库?

2 个答案:

答案 0 :(得分:2)

我不知道是否可以使用.lib创建正确的lib.exe文件,因此我建议创建一个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);
}

答案 1 :(得分:0)

您应该将函数原型声明为extern“C”,因为您(显然)在C ++模式下进行编译:

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

您可以将头文件的整个部分包装在

extern "C" {
    // ... C compatible declarations
}