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

C++ 从MFC客户端调用远程COM组件?,c++,com,mfc,dcom,C++,Com,Mfc,Dcom,我有一个COM组件,它最初是在VisualStudio6中编写的。它是在我的一台开发机器上运行的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,

我有一个COM组件,它最初是在VisualStudio6中编写的。它是在我的一台开发机器上运行的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 };

HRESULT为-2147024891(或转换为十六进制时为0x80070005)的错误访问被拒绝。因此,当尝试连接到远程计算机时,这是一个权限错误。

该错误意味着E\u访问被拒绝。确保当前用户有权访问该组件。在服务器框中的“DCOM配置”下运行
dcomcnfg
(或“组件服务”),在“安全”下找到正确的组件,更改权限以允许调用用户激活和访问


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

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

我以同一用户身份登录两台机器。但是,windows服务正在该计算机上作为本地系统运行。这就是问题所在吗?我在两台计算机上都是以相同的域用户身份登录的,并且在这两台计算机上都有管理员。我在DCOMCNFG中找不到我的组件。应该在那里吗?我在DCOMCNFG中找到了它,并更改了登录到这两台计算机的特定域用户的设置。没什么区别。是的,我错了。我只是从一个例子中复制了这一行。我现在已经阅读了COAUTHINFO结构,并将编辑中显示的行更改为原始帖子。它现在起作用了。谢谢