我有一个 COM 组件,它最初是用 Visual Studio 6 编写的。它位于我在我的一台开发机器上运行的 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
我已经创建了代理 stub 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 structure
关于c++ - 从 MFC 客户端调用远程 COM 组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11313993/