【问题标题】:Calling remote COM component from MFC client?从 MFC 客户端调用远程 COM 组件?
【发布时间】:2012-07-04 16:24:51
【问题描述】:

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

【问题讨论】:

    标签: c++ com mfc dcom


    【解决方案1】:

    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

    【讨论】:

    • 是的,我的错。我只是从一个示例中复制了该行。我现在已经阅读了 COAUTHINFO 结构,并将编辑中显示的行更改为原始帖子。现在可以了。谢谢。
    【解决方案2】:

    -2147024891(或转换为十六进制时为 0x80070005)的 HRESULT 为 ERROR_ACCESS_DENIED。所以尝试连接远程机器时出现权限错误。

    【讨论】:

    • 我在两台机器上都以同一用户身份登录。但是,Windows 服务在该机器上作为本地系统运行。是这个问题吗?
    【解决方案3】:

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

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

    【讨论】:

    • 我在两台机器上都以相同的域用户身份登录,并且我在两台机器上都有管理员。
    • 我在 DCOMCNFG 中找不到我的组件。应该在里面吗?
    • 我在 DCOMCNFG 中找到了它,并更改了登录到两台机器的特定域用户的设置。没有任何区别。
    猜你喜欢
    • 2010-10-03
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2017-12-19
    • 1970-01-01
    相关资源
    最近更新 更多