从 MFC 客户端调用远程 COM 组件
Calling remote COM component from MFC client?
我有一个最初用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 配置"下找到正确的组件,在"安全"下更改权限以允许调用用户的激活和访问。
或者确保调用用户是服务器机箱的管理员。
相关文章:
- 两个 COM 组件中 ENUM 的重复条目
- 从 WinRT C++组件访问 COM 对象
- 组件对象模型 (COM):IMalloc::Alloc 在哪里分配内存?
- 如何在Windows中注册COM(组件对象模型)?(用于图标覆盖处理程序)
- 我需要使用COM(组件对象模块)吗
- 将 DirectShow c++ 的 API 与 C# 结合使用(COM 组件)
- COM+组件的CoCreateInstance失败,返回0x8007007e"找不到指定的模块"
- 现在创建COM组件的最佳方式是什么
- 作为不同用户运行的两个exe如何使用COM(组件对象模型)进行通信
- 从 MFC 客户端调用远程 COM 组件
- 如何在 WinCE 5.0 中注册 COM 组件
- 类未在我自己的 COM 组件上注册 (0x80040154)
- 对COM组件的调用返回错误HRESULT E_FAIL
- C++ VBA 浮点差异中的 .NET COM 组件
- 使用VS2008 express构建COM组件
- 如何从c++ COM组件返回和使用自定义结构对象到c#应用程序
- 如何在c++中创建一个简单的COM组件
- 如何定义COM组件类的实现
- 注册和使用ActiveX/COM组件,该组件是使用运行时生成的UUID通过IDL创建的
- 对接口的Release调用是否确保COM组件不受信任