2009-01-30 52 views
1

我寫了一個OLE自動化服務器(使用Delphi)。我通常手動啓動OLE服務器並將其用作普通應用程序。我不時啓動一個客戶端,其中 自動連接到現有的OLE服務器。如何與第二個客戶端重用(Delphi)OLE服務器?

當我終止客戶端時,服務器不會終止(至少在客戶端之前手動啓動時),但它不會接受任何其他OLE連接。啓動另一個客戶端將觸發一個新的服務器,而不是重新使用第一個。

如何重複使用與第二個客戶端相同的服務器?

(編輯題正確地重新制定它在原來的版本我是問如何防止服務器終止,這是不是一個很好的配方)

+0

如果啓動服務器的兩個客戶端,同一個進程處理兩個客戶端,還是啓動另一個服務器進程,會發生什麼情況? – mghie 2009-01-30 15:14:20

+0

第二個服務器進程自動啓動。 – Name 2009-01-30 15:16:13

回答

2

在Delphi的COM對象嚮導中有一個「Instancing」設置。允許的值是「內部」,「多個實例」,「單一實例」。

我想重複使用與多個客戶端相同的COM服務器。這就是我選擇「單一實例」的原因,儘管如此,我將爲所有客戶端提供一個服務器應用程序實例。但是我錯了。 「單實例」意味着我的服務器中只有一個COM連接實例。我應該選擇「Multiple Instance」以允許在同一臺服務器上進行多個COM連接(但一個接一個,不能同時)。

我認爲在Delphi的COM對象嚮導中使用的詞語並不十分清楚。除了「多個實例」,「單個實例」之外,像這個article about OLE Server and VB這樣的「多用途」和「單次使用」會更好。

0

你應該能夠增加的引用計數器自動化服務器當您啓動服務器作爲正常的應用程序。您想要實現的功能有兩方面:讓客戶端退出時不終止服務器,並且在客戶端仍在運行時關閉主窗體時讓服務器不終止。

+0

我的問題不夠精確。我現在編輯它。 但是,謝謝你的回答:在我讓客戶端啓動服務器並且想在關閉客戶端後保留服務器的情況下,這可能是有用的。 – Name 2009-01-30 15:14:41

0

將COM對象創建爲單例。並且即使在客戶端運行之後也保持對象運行,請增加額外的引用計數。爲此,在COM對象內部調用一次QI。

2

在客戶端,使用

ConnectKind := ckRunningOrNew

和現有的服務器應該使用的,而不是開始一個新的。

0

關於Delphi中的COM對象嚮導中的前一篇文章'有一個設置「Instancing」的說明。 :至少在C++ builder中,這個選項可以簡單地在項目設置項「ATL」中改變後。此項目僅在爲其添加第一個自動化對象後纔會出現在EXE-ole-server上。

(我也問了作者This fine page在第18項中提到這一點)。

0

通過運行dcomcnfg並選擇組件服務/計算機/我的電腦/ DCOM配置並選擇您的服務器,您還可以嘗試更改啓動OLE服務器的用戶的身份(如果它是Exe而不是dll)。

你可能需要玩弄它,我不記得它們之間的差異,但我認爲「交互式用戶」應該這樣做。