在C++中,DLL有可能訪問裝載它的應用程序的某些符號嗎? 我有一個加載插件(dll)的應用程序,這些插件需要訪問應用程序的某些API。DLL需要訪問其應用程序的符號
是否有可能在不創建共享此API的新DLL的情況下實現此目的?
函數指針的結構是否適合這種情況?
示例:在主機應用程序中定義的bool Log(char *)函數以及需要記錄某些事件的插件。
在C++中,DLL有可能訪問裝載它的應用程序的某些符號嗎? 我有一個加載插件(dll)的應用程序,這些插件需要訪問應用程序的某些API。DLL需要訪問其應用程序的符號
是否有可能在不創建共享此API的新DLL的情況下實現此目的?
函數指針的結構是否適合這種情況?
示例:在主機應用程序中定義的bool Log(char *)函數以及需要記錄某些事件的插件。
將回調接口傳遞給插件DLL的另一個投票。即回調接口...
class IHostApplication
{
public:
virtual bool Log(const wchar_t* ip_log_string) = 0;
};
的DLL插件接口
class IPlugin
{
public:
virtual void InitializePlugin(IHostApplication *ip_host) = 0;
};
主機將加載插件DLL(動態如果必要的話),然後通過本身作爲IHostApplication *到插件,使您可能想要的任何回調。
這是可能的,但你的設計選擇是值得懷疑的。
EXE可以使用與DLL相同的方式導出函數,因此您可以使用熟悉的方式使用GetProcAddress。
然而,你爲什麼設計它,以便插件需要知道任何有關主機程序的內部功能?它應該是相反的。
主機應該要求插件實現一組例程(它們導出),遵守特定的合同。作爲接口的一部分,主機可以根據需要將指向特定主機的信息傳遞給結構體(比如版本信息,功能)等。
插件不應該嘗試獲取到主機模塊的函數指針。
傷害在哪裏?無論如何,插件必須遵守非常具體的合同,如果除了主機應用程序加載它,任何人都可能無法工作。如果可執行文件還導出一些插件調用的符號,我看不到太大的傷害。 – 2010-12-13 14:30:16
回調函數指針,回調函數指針列表或回調接口指針 - 我會使用這些選項之一。 Dll客戶端必須實現回調接口並傳遞指向該接口的指針來動態創建Dll。 Dynalically創建的Dll保留這個指針,並在必要時調用它的函數,例如,報告一些事件。
+1,但在C++之上構建一個插件體系結構是一個不錯的選擇?該插件必須用相同的C++編譯器構建(如果不是至少是製造商的版本)。 – 2010-12-13 14:59:40
如果你非常喜歡,你總是可以外接「C」 - 這當然會限制你使用C風格的功能接口,但這是一種折衷。我會建議COM,但我不能這樣做直面:) – 2010-12-14 11:04:42