2010-09-06 44 views
0

我真的需要幫助......如何加載DLL作爲本地服務器

我實現了一個COM組件(即A.DLL)與IDL,還編寫了一個包裝DLL(B.DLL)爲零件。我已經實現了DLL「A」所需的導出函數,並將其註冊爲「regsvr32.exe」。

問題是我有3個EXE文件使用B.dll來訪問A.dll的方法。但是,我無法設法爲A.dll創建本地服務器,因此每個EXE都會加載一個新的A.dll和B.dll。我只想加載A.dll一次,並需要在B.dll中實現此功能。最後的聲明也開放供討論。

但是,我無法找到任何有關此問題的有用示例或資源。任何幫助將不勝感激,在此先感謝。

+0

你爲什麼反對讓這些庫加載好幾次? – sharptooth 2010-09-06 07:03:45

+0

@sharptooth因爲,A.dll打開一個數據庫文件作爲資源,並且多次打開此文件會導致問題。 – 2010-09-06 07:07:34

+0

我明白了。我想更好的解決方案是使用NT服務來處理數據庫。這樣你就不必關心同時擁有多少個COM服務器副本 - 他們會通過說RPC來與服務對話,並且該服務將在內部同步對數據庫的訪問。 – sharptooth 2010-09-06 07:28:38

回答

1

由COM介導的DLL被稱爲進程內服務器。這就暗示了你的問題:它總是被映射到客戶端的內存空間,就像任何其他DLL一樣。同樣,任何DLL負載都將映射到原始進程中。目前尚不清楚你的問題爲什麼你不想使用DLL。如果是爲了節省資源,那麼就要考慮只有數據會被複制;該代碼將只加載一次。如果這是因爲您希望他們共享數據,那麼請考慮使用共享內存。如果你真的希望所有三個.exe都由一個實例提供服務,那麼你需要的是一個COM本地服務器,它將通過.exe而不是.dll實現。

+0

或者使用DLL的代理可執行文件:https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686606(v=vs.85).aspx – vines 2018-02-16 11:19:24

1

沒有「創建本地服務器」這樣的事情。進程內服務器必須加載到每個消費者進程中,這是沒有辦法的 - 每個消費者都是一個獨立的進程,所以它有自己的代碼和數據副本。

爲了讓一個進程爲所有消費者執行COM服務器代碼,您必須創建一個out-proc服務器。要做後者,您可以重新構建COM服務器或嘗試使用COM +服務器應用程序。通過這種方式,您可以有一個單獨的進程運行多個使用者可以連接的COM服務器代碼。

+0

不明白你爲什麼得票低。答案很好。 – Timores 2010-09-06 09:51:14

相關問題