我有一個.dll
我懷疑使用__stdcall
函數,但完全未裝飾的名稱(甚至沒有下劃線或@
符號)。我寫了一個.def
文件它的別名一樣__stdcall沒有任何裝飾
func1 = func1
[email protected] = func1
但我認爲lib
(這我使用創建一個從.def
文件導入庫)被忽略別名(鏈接器還稱[email protected]
是不確定的)
如何創建將[email protected]
映射到func1
的導入庫?
我有一個.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