2010-07-29 56 views
0

我有一個應用程序,假設是在插件模式下實現的。
插件位於dll文件中,我根據用戶通過命令行給出的參數實時加載插件。也就是說,如果用戶想要使用plugin1,那麼他在運行應用程序時在命令行中輸入該名稱作爲參數,我應該在運行時加載它。
由於我使用的插件模式,我有一個接口(因爲工作在c + +它是一個抽象類),所有的插件類實現。
我的困境是把接口類放在哪裏?爲了構建dll,我必須在每個dll中聲明一個接口。
我想避免在需要更改界面時更改所有dll中的界面。
另一方面,如果我在主應用程序中聲明接口類,我的dll將不會被編譯和構建?
是否有關於如何從dll中提取接口類並將其放入主應用程序的建議,所以當我想更改它的代碼時,不需要在十幾個位置更改它(即在每個DLL)。插件模式與.dll。我怎樣才能從DLL提取插件接口?

由於提前,

乾杯

回答

1

你將不得不存儲在公共位置的接口定義(中說\ INC子目錄單獨的.h文件中),你將不得不重新編譯所有的庫一次你改變界面。在C++中沒有辦法解決這個問題。如果你需要唯一標識接口的能力,你可以使用類似COM的東西,並在每次中斷接口時改變接口標識符(同樣,你將不得不重新編譯實現,但是對於COM來說,由於DLL地獄,客戶端不會遇到未定義的行爲)。

1

如果通過「接口」你正在討論描述你的基抽象類的頭文件,我沒有看到真正的問題。

您可以在多個項目中共享和使用一個文件(這裏是一個「頭文件」)(「項目」是您的主應用程序或您的一個插件)。在你的情況下,它確實非常有意義。

0

每個DLL需要具有相同的導出函數,該函數返回一個指向您的接口的指針。每個DLL應該負責實例化'接口'(實際上是真的子類)。 所以主應用程序會出現,在DLL上調用LoadLibrary,然後使用GetProcAddress,將調用DLL上的導出函數。然後導出的函數應該實例化具體接口並返回一個指向它的指針。

問題: 「把接口放在哪裏」 答案: 在你的'public'API文件夾中。

0

我曾經在C#中做過這件事,但也許它可以幫助你。我在一個單獨的項目中創建了一個接口和抽象類,主應用程序和插件引用它。這樣,只有一個地方可以進行編輯。

主要APP.EXE < - > PluginInterface.dll < - > APlugin.dll

不知道你會怎麼用C實現這一點++,我想你可以創建插件接口一個單獨的DLL和加載你的EXE和你的插件的DLL的。

希望有所幫助。