2015-06-02 122 views
2

我正在開發一個應作爲服務運行的DCOM應用程序。 我設法使這個應用程序作爲一個獨立的應用程序(客戶端請求的組件,並啓動獨立的應用程序) - 做到這一點,我正在執行 MyApp.exe/regserver 但我運行後 MyApp .exe/service 客戶端無法訪問應用程序 - 既不在服務運行時,也不在服務器運行時。 客戶端不是由我開發的(實際上,這是Excel RTD功能),所以我無法檢查問題發生的步驟。 那麼,我應該如何註冊一個類/應用程序,以便它作爲服務運行? 在VS2013開發,創建了ATL項目「service exe」。註冊COM類作爲服務運行

回答

2

服務的COM註冊ATL項目與其應用程序模式非常相似:COM類的註冊表鍵與服務器託管服務的唯一區別相同。然而,更重要的是,客戶端跨會話邊界訪問服務COM對象,並使用不同的憑據。 YourApp.exe作爲本地系統登錄的服務運行(除非您手動更改或調整了COM註冊碼),而客戶端以用戶身份登錄。

使其成爲服務,請務必查看您的COM對象的Launch and Activation Permissions。對於故障排除,您可能還需要更改服務的用戶帳戶以匹配運行客戶端應用程序的用戶(以排除與權限和不同用戶帳戶相關的問題)。

+1

註冊不*完全相同。當作爲服務託管時,COM類註冊需要['AppID'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682359.aspx)和['LocalService']( https://msdn.microsoft.com/en-us/library/windows/desktop/ms693774.aspx)值來指定服務名稱,因此COM可以啓動它尚未運行的服務。 –

+0

@RemyLebeau:是的,這是包含在「非常相似」。相同的鍵,小的服務相關的差異。關鍵是「/ service」完全覆蓋了這一點(特別是:不需要從代碼中執行LocalService) - ATL可以直接使用),典型問題與權限有關,而不是註冊本身。 –

+0

這也是我的印象。我所做的是: - 創建HKCR/CLSID/{具有正確CLSID的密鑰CLSID的類的ProgID - 創建HKCR/CLSID/{CLSID類的值爲應用程序的值AppID - 創建HKCR/AppID/{AppID的值} LocalService =服務名稱 - 使用dcomcnfg,允許所有內容爲「Everyone」 我在服務器啓動和類啓動時都有調試輸出。但日誌是空的。 好東西是 - HKCR/CLSID/{CLSID}有關鍵的「LocalServer32」,但沒有嘗試作爲服務器運行,所以我認爲它在HKCR/AppID/{AppID中找到LocalService},但是某些原因無法運行。 – thedimitrius