我们正在尝试与在提供COM接口的Windows XP盒上运行的应用程序进行交互。当非作为服务运行的应用程序作为与我们的测试代码相同的Windows用户运行时,我们能够实例化COM接口并对其进行调用而不会出现任何问题。我们正在使用一个简单的实例化:
using ServerLib;
...
ServerLib.ServerObject server = new ServerObject();
但是,当我们以不同的用户身份登录同一台计算机,因此服务器和应用程序在不同的进程空间下运行,并尝试运行相同的代码时,我们会收到错误消息:
An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll
Additional information: Retrieving the COM class factory for component with CLSID {BE8BD673-1442-449F-B56D-A7CC00DA1B0E} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
系统事件查看器中的条目提供了一个线索:
The server {BE8BD673-1442-449F-B56D-A7CC00DA1B0E} did not register with DCOM within the required timeout.
Windows事件日志条目也提供了一些线索,但没有答案:
已创建新流程:
新进程ID:3168
图像文件名:C:\ BIN \ server.exe
创建者进程ID:3348
用户名:USERNAME
域名:DOMAIN
登录ID:(0x0,0x3E7)
为进程分配了主令牌。
分配流程信息:
进程ID:3348
图像文件名:C:\ WINDOWS \ system32 \ winlogon.exe
用户名:USERNAME
域名:DOMAIN
登录ID:(0x0,0x3E7)
新工艺信息:
进程ID:3168
图像文件名:C:\ BIN \ server.exe
用户名:CallingUser
域名:DOMAIN
登录ID:(0x0,0x217579E)
进程已退出:
进程ID:3168
图像文件名:C:\ BIN \ server.exe
用户名:CallingUser
域名:DOMAIN
登录ID:(0x0,0x217579E)
我们还尝试了一些替代的实例化技术,比如这个尝试并附加到现有流程:
ServerLib.ServerObject foo = (ServerLib.ServerObject)System.Runtime.InteropServices.Marshal.GetActiveObject("Server.ServerObject");
这会出现以下错误:
An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll
Additional information: Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))
我们怀疑这个问题围绕着这样一个事实:我们的测试代码是在与托管COM接口的代码不同的登录名下运行的。我们不知道的是如何设置配置以允许我们使这项工作。托管COM接口的服务器是单例,并且无法启动副本以通过我们的客户端软件处理COM请求。
在同一台计算机上获取客户端应用程序需要哪些步骤,但是在不同的进程空间下实例化COM接口并调用.exe文件主机中的方法?