2009-12-09 14 views
1

我們的行業是高性能的分佈式並行計算。我們有一個使用Visual Studio 2008開發的非託管C++應用程序。非託管C++:如何動態加載代碼?

我們的應用程序(更像是一個框架)應該能夠動態加載由第三方開發的代碼(算法),這些代碼(可以有許多dll)到我們的接口規範,並調用加載的代碼來獲得一些結果。

認爲它就像你想調用sin(x)函數一樣,但是可以使用許多不同的sin(x)實現。

我有幾個問題,因爲我很新的這方面的動態加載代碼:

  1. 是DLL(動態鏈接庫)回答這個類型的要求?
  2. 如果第三方使用不同類型的IDE來創建與我的dll相比較的dll(比如Eclipse CDT,C++ Builder,Visual C++ 6.0等),那麼dll是否仍然可以與我的應用程序一起工作?
  3. 我們的應用程序也應該跨平臺工作(應該可以在Linux上運行),使用QLibrary是最合理的方式來抽象出所有平臺特定的dll加載?
  4. (可選)我可能遇到一些無法預料的問題嗎?

回答

1
  1. 是的。但是有很多問題。
  2. 可能或不可以。首先,你應該知道calling conventions。其次,由於C++沒有標準化的ABI,所以你應該在界面層面堅持使用普通的C語言。(順便說一句,COM技術就是這麼做的 - 製作一個標準化的ABI)。第三,每個插件可能有自己的CRT,所以可能會出現問題,在MSDN上有關於此的好的article
  3. 是的,這將有助於加載動態庫,但不會影響(2)中的問題。儘管這些問題大部分都是Windows特有的。
3

1)一般來說,是的。如果API變得複雜且多對象,我會使用COM或類似的機制。但是,如果你只需要管理一個小的狀態,或者可以完全無狀態,那麼純粹的DLL接口就可以。

2)使用合適的調用約定(stdcall)和數據類型。我甚至不會說實施必須使用C++。所以這意味着char/wchar_t,明確大小的整數,例如int32,float和double,以及它們的C風格數組。

3)不能說

4) 沒有跨境內存分配:你自由分配什麼,並讓插件釋放它所分配。

您的API設計對可實現的性能和實施工作有很大的影響。不要讓職能,小,給實施一定的自由如何處理某些事情,定義錯誤協議,穿線要求等

[編輯]
另外,如果你聲明的結構,考慮對準和編譯器選項來控制這個(通常是#pragma pack)。這是必需的,所以客戶端看到相同的佈局。

編譯器通常會「損壞」導出符號的名稱(例如,爲STDCALL約定添加udnerscore)。通常,這通過傳遞給鏈接器的.def文件進行控制。

+0

我一直在閱讀Wiki,在我看來,編程平臺從DLL - > COM - > COM + - > .NET演變而來?如果是這樣,我應該只用COM嗎? – sivabudh 2009-12-10 19:16:28

+0

真的取決於複雜性。 COM開發可能會很痛苦,OTOH COM解決了接口變得越來越複雜時遇到的一些問題。如果API非常簡單,而且您之前沒有使用COM的經驗,我會建議您不要。 – peterchen 2009-12-10 21:56:29

0

以我的經驗,QLibrary是您的問題的最佳答案。 它提供了一個簡單的界面,並處理所有平臺特定的細節。 的確,這意味着插件也必須使用QT編寫。