2011-01-21 70 views

回答

10

如果您希望在編譯器(以及Release/Debug)中兼容並使用C++,則需要多花點功夫。

基本上 - 您可以傳遞基本的數據類型和指向純虛擬類的指針。這些類不能包含任何數據成員,它們的析構函數不能是公有的,它們不應該有重載函數。

內存不能分配在一個DLL中,並在另一個DLL中釋放。這意味着沒有例外,您需要某種引用計數或返回機制。

純虛擬類(又名「接口」)內的所有方法都必須標記爲調用約定(我更喜歡stdcall)。

動態轉換也是不可能的,因此您可能需要在所有接口中執行一些功能來完成這些技巧(如COM中的QueryInterface)。

這是可行的,因爲win32上的大多數編譯器都嘗試與COM兼容,並以COM兼容的方式解決相同的問題。爲了獲得第一個接口,您需要一個從dll導出的純C函數。

如果你只是使用C函數和C數據類型,一切都會工作。但是,那麼你只能繼承C而不能繼承類。

我希望有幫助。


名稱重整是沒有問題的:

1:如果您使用的C函數C數據類型,一切都被定義,沒有名稱重整(例外:在VS與STDCALL,您需要重新映射通過鏈接器指令將名稱改爲「正常」C名稱)

第二種:類內的方法不會被導出,因此不會被損壞。您可以通過指向純虛擬類的指針(又名「接口」)來調用方法。這使用一個偏移量和沒有名字。你仍然不能使用析構函數,因爲據我所知,vtbl內部析構函數的位置並不是固定的。


如果您將結構傳遞給函數/方法,請務必修復對齊。它沒有在不同的編譯器中定義。

0

一個想法可能是使用標準的extern C函數來創建一個ClassFactory。對於一個固定的(或更多)入口點來說,dll必須公開一個有效的插件。

+0

是的,唯一導出的函數是extern「C」Plugin * GetPluginObject()。我之前完成了這個工作,但後來我控制了DLL(即不讓MinGW/Borland等進入方程) – Robert 2011-01-21 09:04:36

+0

如果你的GetPluginObject返回一些從某個* pure *虛擬類派生的類的istance,那麼aren不同編譯器實現之間的VTable是否兼容?我認爲微軟COM利用這些想法... – 2011-01-21 09:06:58