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

Calling remote COM component from MFC client?

本文关键字:COM 组件 调用 MFC 客户端      更新时间:2023-10-16

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

ERROR_ACCESS_DENIED 的

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

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

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