2013-09-11 59 views
1

我從頭開始設計一個模塊化軟件基礎結構,其中不同的DLL擁有不同的業務邏輯和應用程序邏輯。每個DLL通過常見的DLL調用都有自己的初始化/非初始化機制。如何讓多個DLL實例能夠訪問對方?

比方說,我有一個使用這些各種不同的DLL的主機應用程序。所有這些DLL都由主機應用程序通過LoadLibrary加載和初始化。當一個DLL初始化時,它實例化一些內部全局變量。我可以使用另一個DLL連接到這個並訪問相同的實例,而無需通過主機進行路由嗎?當然,從另一個DLL中調用LoadLibrary會創建另一個實例,並且直接調用DLL也不會被初始化/實例化?

我如何從一個DLL到另一這是由同一個主機應用程序初始化訪問實例化的數據?

例如,數據庫連接。我使用獲取/執行等方法在一個DLL中封裝了一個ADO連接。我希望一個DLL使用從DB DLL中的主機應用程序實例化的相同連接。

+0

* ..會創建另一個實例.. * - 如果您沒有釋放該庫,則不需要。在可執行文件加載該庫後,* other *庫將使用已映射到可執行文件地址空間的* instance *。您可以通過導出的函數將全局數據導出到其他庫和可執行文件,只要您不釋放庫,它就不會再次初始化。庫不會自行運行,它們是可執行的運行代碼。 –

+1

只是澄清:加載已加載的DLL的新可執行程序將重新使用相同的代碼但不是相同的數據(除非它在共享數據段中聲明 - 某些Delphi不允許定義)。 – HeartWare

回答

3

庫(DLL模塊)在進程中共享。一個庫的全局變量只有一個實例。當您在已經加載的DLL上調用LoadLibrary時,會向已加載的模塊返回一個模塊句柄。一個DLL只能加載一次到一個進程中。

所以,這是完全正常的供您使用的LoadLibrary,然後調用該庫的功能。

彷彿你是確保庫已經被加載,你可以使用的GetModuleHandle的替代品。例如,你永遠不需要爲kernel32調用LoadLibrary,因爲它總是被加載。

+0

不知道爲什麼我不接受這些年前... –

0

關於如何經由共享存儲器映射文件做它的一個示例見this article

+0

共享內存可能是通信的錯誤方法。這就是說,在一個單一的過程中,你爲什麼要選擇內存映射?如果你想共享內存,你可以訪問共享虛擬地址空間。 –

+0

正確 - 如果它在同一進程內,則不需要使用共享內存。我把他的問題看作是來自兩個不同的過程,但仔細觀察,可能是我讀錯了。無論如何 - 對於多進程數據共享,上述是這樣做的一種方式... – HeartWare

相關問題