2015-06-02 120 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