2012-07-19 56 views
0

我正在開發一個應用程序,需要以多種文件格式讀取併合並數據。由於我們可能希望在未來支持其他格式,所以文件讀取器必須作爲DLL開發,並在運行時根據用戶輸入加載。我通常會一次加載兩個DLL。
我在想我可以創建一個抽象接口(Like this),但是如果我在每個(子類)DLL類中使用工廠函數,那麼當我加載兩個DLL時,這兩個函數定義將互相干擾。我錯過了什麼嗎?有一個更好的方法嗎?在C++中使用DLL進行子類化

謝謝!

+1

如果您使用LoadLibrary加載DLL並通過GetProcAddress獲取指向工廠函數的指針,則不會出現像您想象的那樣的問題。請注意,您可能不會釋放從另一個DLL/EXE的DLL/EXE中分配的內存! – MFH 2012-07-19 19:44:01

+0

@MFH,這是一個很好的答案,爲什麼讓它成爲評論? – eran 2012-07-19 19:46:42

+0

@eran謝謝,我沒有:) – MFH 2012-07-19 19:54:36

回答

1

(從評論升級)

如果用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文件)!

+0

謝謝!我沒有用DLL做很多,完全忘記了需要獲得一個指向導入函數的指針。 – JeffW 2012-07-23 15:30:59