我正在開發一個應用程序,需要以多種文件格式讀取併合並數據。由於我們可能希望在未來支持其他格式,所以文件讀取器必須作爲DLL開發,並在運行時根據用戶輸入加載。我通常會一次加載兩個DLL。
我在想我可以創建一個抽象接口(Like this),但是如果我在每個(子類)DLL類中使用工廠函數,那麼當我加載兩個DLL時,這兩個函數定義將互相干擾。我錯過了什麼嗎?有一個更好的方法嗎?在C++中使用DLL進行子類化
謝謝!
我正在開發一個應用程序,需要以多種文件格式讀取併合並數據。由於我們可能希望在未來支持其他格式,所以文件讀取器必須作爲DLL開發,並在運行時根據用戶輸入加載。我通常會一次加載兩個DLL。
我在想我可以創建一個抽象接口(Like this),但是如果我在每個(子類)DLL類中使用工廠函數,那麼當我加載兩個DLL時,這兩個函數定義將互相干擾。我錯過了什麼嗎?有一個更好的方法嗎?在C++中使用DLL進行子類化
謝謝!
(從評論升級)
如果用LoadLibrary加載的DLL你得到一個句柄DLL - 你必須在FreeLibrary以後使用卸載DLL!
獲取句柄後,您可以調用GetProcAddress來獲取指向該函數的指針。
示例代碼:
auto library = LoadLibrary("sample.dll");
//test if library is null => error handling
auto func = GetProcAddress(library, "function");
//test if func is null => error handling
//you may need to cast func to a different function pointer
auto plugin = func();
//after use:
auto result = FreeLibrary(library);
//test for error
正如我在註釋中已經提到:永遠不要RELEASE內存中分配一個DLL從另一個上下文(其它DLL或EXE文件)!
謝謝!我沒有用DLL做很多,完全忘記了需要獲得一個指向導入函數的指針。 – JeffW 2012-07-23 15:30:59
如果您使用LoadLibrary加載DLL並通過GetProcAddress獲取指向工廠函數的指針,則不會出現像您想象的那樣的問題。請注意,您可能不會釋放從另一個DLL/EXE的DLL/EXE中分配的內存! – MFH 2012-07-19 19:44:01
@MFH,這是一個很好的答案,爲什麼讓它成爲評論? – eran 2012-07-19 19:46:42
@eran謝謝,我沒有:) – MFH 2012-07-19 19:54:36