從DLL導入C++類的正確方法是什麼?我們使用Visual C++。動態地從DLL中導入C++類
有dllexport/exports.def + LoadLibrary + GetProcAddress trifecta,但它不適用於C++類,僅適用於C函數。這是由於C++名稱 - mangling?我如何完成這項工作?
從DLL導入C++類的正確方法是什麼?我們使用Visual C++。動態地從DLL中導入C++類
有dllexport/exports.def + LoadLibrary + GetProcAddress trifecta,但它不適用於C++類,僅適用於C函數。這是由於C++名稱 - mangling?我如何完成這項工作?
找到在http://www.codeproject.com/KB/DLL/XDllPt4.aspx
感謝解決方案努力爲您傢伙&女孩
我通常聲明一個接口基類,在我的應用程序中使用這個聲明,然後使用LoadLibrary,GetProcAddress來獲取工廠函數。該因子總是返回接口類型的指針。
這是一個實際的例子,exporting an MFC document/view from a DLL,動態加載
DLLEXPORT/dllimport的作品,在頭文件中的類名之前把它和你去好。
通常你想在dll中使用dllexport,在exe中使用dllimport(但是你可以在任何地方使用dllexport,它的工作原理是「正確的」使它加載速度更快)。
顯然是用於鏈接時編譯。您可以使用/ delayload鏈接器指令使其成爲「動態」,但這可能不是您想要的主題行。
如果你真的想要一個LoadLibrary樣式加載,你將不得不用「extern C」包裝來包裝你的C++函數。問題是由於名稱混亂,你可以輸入完整的名稱,它會工作。
解決方法通常是提供一個C函數,該函數返回一個指向正確類的指針 - COM以這種方式工作,因爲它從dll導出4個C函數,用於獲取dll中對象內的接口方法。
您需要添加以下內容:
extern "C"
{
...
}
避免功能截斷。
你可能會考慮寫兩個簡單的C函數:
SomeClass* CreateObjectInstace()
{
return new SomeClass();
}
void ReleaseObject(SomeClass* someClass)
{
delete someClass;
}
只用你也可以在以後添加這些功能/你的對象創建/刪除的改變功能。這有時稱爲工廠。
退房this question。基本上有兩種方法。您可以使用_dllexport標記該類,然後鏈接到導入庫,並且該DLL將自動加載。或者如果你想自己動態地加載DLL,你可以使用@titanae建議的工廠函數想法
不應該這些`SomeClass`名稱帶星號(即指向`SomeClass`的指針)嗎? – 2011-09-13 14:17:06