2011-08-30 130 views
0

我在Delphi中編寫了一個導出函數的DLL。我想在C++程序中使用這些函數,而不使用動態鏈接(LoadLibrary()API調用)。VC++/Dev-C++:如何包含一個DLL?

「導入」 宣言將是

extern "C" int __stdcall getVersionNumber(); 

我主要用流血開發-C++它創建的Windows可執行文件。但我不知道如何告訴編譯器它應該從「STATMONDLL32.dll」中導入函數「getVersionNumber」。

我花了好幾個小時的搜索問題,沒有任何結果(只有奇怪的東西寫有關.a文件和.lib文件,我沒有編譯的Delphi ...)我也安裝了VC++ ,但即使在那裏,我也找不到一種方法告訴編譯器使用特定的DLL。

我爲這個DLL創建了一個DEF文件 - 我該如何告訴Dev-C++和/或VC++使用它? (Dev-C++首選)

//編輯:Delphi正在創建UNDECORATED符號。該符號正好是「getVersionNumber」。

我已經創建了下面DEF與裝飾的別名文件:

LIBRARY STATMONDLL32 
EXPORTS 
    getVersionNumberA = [email protected] 

我創建了一個*的.lib文件與VC++ 「LIB.EXE」:

lib.exe /DEF:StatMonDll32.def /OUT:StatMonDll32.lib 

我已經包括在VC++鏈接器設置中的lib。

但VC++告訴我它無法解析外部符號_getVersionNumberA @ 0!請幫忙!

//編輯:我已經在這裏上傳了DLL:http://www.viathinksoft.de/temp/StatMonDll32.dll。你能用VC++訪問符號getVersionNumberA嗎?我在尋找,因爲現在6天的解決方案:「 - (

問候

丹尼爾·馬紹爾

+0

[請勿使用Dev-C++。](http://stackoverflow.com/tags/dev-c%2b%2b/info) –

回答

0

您可以使用動態鏈接,它應該工作沿着線的東西:

extern "C" typedef int (__stdcall *pfnadd)(int a, int b); 
extern "C" typedef int (__stdcall *pfngetversion)(void); 
HMODULE mod = LoadLibraryA("mydll.dll"); 
pfnadd add = (pfnadd)GetProcAddress(mod, "Add"); 
pfngetversion getVersionNumberA = 
     (pfngetversion)GetProcAddress(mod, "getVersionNumberA"); 

,然後你可以通過調用函數指針:

add(1, 2); 
std::cout << getVersionNumberA(); 

雖然,看起來你的問題似乎有兩個不同的功能!

+0

感謝您的評論。我知道我可以使用動態鏈接,但我希望以靜態的方式來完成它,比如WinAPI DLL鏈接在一起。在我的文章中,我正在談論不同的功能,但我在測試中只使用了1個名稱。我想知道爲什麼沒有人知道這個簡單問題的答案。我只想靜態鏈接未裝飾的函數名稱。 (注意:如果這個名字是用「@ 0」裝飾的,它就會起作用(測試)。但事實上,Delphi會創建一個未修飾的符號)。 –

+0

@Daniel:對不起,我錯過了你問題開頭的那句話,你說「沒有'LoadLibrary'」。您需要創建一個與DLL匹配的靜態導入庫。 cygwin爲此提供了很好的工具(這解釋了你通過google學到的.a文件),MSVC++更少,我也不知道Dev-C++。 –

+0

這可能有助於MSVC++:http://support.microsoft.com/kb/131313 –