__stdcall没有任何装饰
问题描述:
我有一个.dll
我怀疑使用__stdcall
函数,但完全未装饰的名称(甚至没有下划线或@
符号)。我写了一个.def
文件它的别名一样__stdcall没有任何装饰
func1 = func1
[email protected] = func1
但我认为lib
(这我使用创建一个从.def
文件导入库)被忽略别名(链接器还称[email protected]
是不确定的)
如何创建将[email protected]
映射到func1
的导入库?
答
你应该在声明函数原型为extern“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) {}
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);
}
导出文件中的语法看起来不正确。请确保使用dumpbin.exe进行检查。通常每行只需要包含你希望函数具有的名称(例如'func1'),链接器将自己弄清楚细节。 – 2015-09-02 12:06:55