2013-09-21 86 views
0

大家好!dll中有多個類和全局變量的多個dll

我對使用C++進行.dll編程有一些疑問,對我來說這是比較新的。

1)如果我想有多個類創建DLL,但我還是想創建抽象接口爲每個類,我應該創建一個頭文件接口,或者每個抽象類創建單獨的多個標頭?我應該怎麼做.cpp實現工廠功能?

2)如果我創建對象和工廠功能,並得到一個指針的實例,可我只是調用程序「刪除」時,我想釋放內存?我認爲,該對象被放置在dll的頁面中,並且可能存在一些問題。在這種情況下我應該如何正確釋放內存?

3)我看,如果有多個進程結合的.dll - DLL爲每個項目創建全局變量的單獨的單個實例。這是對的嗎?那麼我有兩個問題,如果它是真的:

3.1)在靜態成員在DLL中會發生什麼?如果我想創建一個單身經理,我可以將它放在dll中嗎? 3.2)如果我有Core.dll和Graphics.dll,Sound.dll和Physics.dll。 Core.dll有一個全局變量(或者在我的真實情況下是一個單身管理器)。其他dll是否可以與單例的一個實例或其他實例一起工作? (每個DLL使用Core.dll)

我爲我的軟弱英語和一個話題:)

感謝您的關注和答案在許多問題道歉。

回答

1

1:這主要取決於您,取決於項目的規模。對於小事來說,它很重要,所以保持簡單並且有一個標題。在較大的項目中,最好儘可能減少不必要的相互依存關係 - 因此將它們放在單獨的文件中。你可以創建包含其他內容的「all.h」。

2:是的,如果DLL和EXE都鏈接到多線程DLL CRT。除非你知道自己在做什麼,否則一定要使用它,因爲它是最安全的,並且會做你期望的 - 它會導致exe和dll(s)能夠共享堆,就好像它們是單個可執行文件一樣。你可以在DLL中「新的對象()」和exe中的「刪除obj」。 注意:混合不同版本的EXE和你的DLL可能會引入令人難以置信的微妙錯誤(如果某個類/結構定義發生變化),那麼不要這樣做。

3:每個進程都有自己獨立的內存空間(除非你專門做某些事情,試圖得到一些共享內存)。不允許進程訪問其他進程的內存。

3.1:我強烈建議您避免全局狀態。 (全局靜態常量是OK)。全局變量導致許多意想不到的困難問題,而Windows DLL中的全局變量又有一些額外的複雜性。從長遠來看,要在EXE必須調用的DLL中有明確的「Initialize/Deinitialze」函數,這會更好。

但是,在一個dll全球靜態並不比一個可執行很大的不同......加載DLL時,他們得到幾乎相同的方式進行初始化。 (動態加載DLL時,這會變得更加複雜,但在這裏忽略它)。

3。2:是的,他們會與單一實例合作 - 但不要這樣做,最終你會後悔的。由於無法控制構造全局變量的順序,所以更好地使初始化顯式化,這可能會很快導致非常困難的初始化問題。