0

我有一个最初用 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 };
4

3 回答 3

2

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

于 2012-07-03T17:21:38.047 回答
0

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

于 2012-07-03T15:32:42.053 回答
0

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

或者确保调用用户是服务器框上的管理员。

于 2012-07-03T15:37:17.160 回答