2012-03-26 77 views
2

我有一個.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

回答

0

你應該在聲明函數原型爲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

2

我不知道是否有可能使用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); 
}