从MFC客户端调用远程COM组件?

时间:2012-07-03 15:15:40

标签: c++ com mfc dcom

我有一个最初用Visual Studio 6编写的COM组件。它是在我的一台开发机器上运行的Windows服务中。我已经写了一个快速的MFC测试应用程序来调用它,这从这台机器运行时工作正常,代码看起来像

COSERVERINFO si; 
MULTI_QI qi; 
COAUTHINFO cai = { RPC_C_AUTHN_NONE, RPC_C_AUTHZ_NONE, 0,RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IMPERSONATE,0, EOAC_NONE };
si.dwReserved1 = 0; 
si.pwszName =L"{machine name}"; 
si.pAuthInfo = &cai; 
si.dwReserved2 = 0; 

qi.pIID = &IID_IMyComponent; 
qi.pItf = NULL;
qi.hr = 1; 

HRESULT hr = CoCreateInstanceEx(CLSID_MyComponent,NULL,CLSCTX_REMOTE_SERVER ,&si,1,&qi);

但是,当我将MFC测试应用程序移动到我的其他开发计算机并尝试在另一台计算机上调用该组件时,它将失败。从CoCreateInstanceEx返回的hresult是-2147024891

我已经创建了代理存根DLL并在两台机器上注册了它。我错过了别的什么吗?

更新: 我现在将COUTHINFO结构更新到下面,它可以工作。

    COAUTHINFO cai = { RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, 0, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE,0, EOAC_NONE };

3 个答案:

答案 0 :(得分:2)

ERROR_ACCESS_DENIED很可能是由于COAUTHINFO提供了错误的参数。您将身份验证,授权级别设置为NONE,这不足以获得与远程计算机连接的权限。尝试设置这些值:RPC_C_AUTHN_DEFAULT(让COM协商最佳身份验证服务),RPC_C_AUTHZ_NONE,RPC_C_AUTHN_LEVEL_DEFAULT,RPC_C_IMP_LEVEL_IMPERSONATE。另请参阅MSDN源代码 - COAUTHINFO structure

答案 1 :(得分:0)

HRESULT为-2147024891(或转换为十六进制时为0x80070005)为ERROR_ACCESS_DENIED。因此,尝试连接远程计算机时出现权限错误。

答案 2 :(得分:0)

错误表示E_ACCESS_DENIED。确保当前用户有权访问该组件。在服务器框上,在" DCOM配置"下运行dcomcnfg(或"组件服务")在"安全"下找到正确的组件。更改权限以允许主叫用户激活和访问。

或确保主叫用户是服务器上的管理员。