QueryInterface因E_ACCESSDENIED而失败

时间:2011-06-28 07:36:47

标签: c++ com dcom

以下方法是DCOM服务器方法。 COM客户端和服务器在不同的WinXP计算机上运行。 COM客户端调用RegisterClient方法来注册回调接口。问题是QueryInterface方法失败,错误代码为E_ACCESSDENIED。这个问题可能是什么原因?

STDMETHODIMP CGEMExtension::RegisterClient(IUnknown** ppGEMExtensionEvents, int* nClientId, int* nResult)
{
    HRESULT  hRes = (*ppGEMExtensionEvents)->QueryInterface(IID_IGEMExtension,(void**)&pUnknown);
    return hRes;
}

3 个答案:

答案 0 :(得分:3)

当您获得E_ACCESSDENIED时,这意味着您有权限问题(不要在防火墙或注册上花费时间 - 前者会引发错误,告诉您服务不可用,而后者会告诉您课程是没有注册等)。 COM依赖于Windows权限,因此这是您应该关注的内容。

在您的情况下,如果我理解正确的情况,服务器实际上调用客户端,以获得正确的接口。为此,运行服务器的用户应该在客户端具有正确的权限。一些建议:

  1. 正如daramarak建议的那样,让服务器和客户端使用相同的域用户,或使用相同密码的同一本地用户。
  2. 在客户端上,将this setting设置为“classic”。
  3. 使用DCOMCNFG为服务器的用户(如果客户端已知)提供其他权限。

答案 1 :(得分:1)

这可能是因为另一台计算机上的正确权限是错误的。检查此问题的最简单方法是使用secpol(本地策略,审核策略,打开登录事件和对象访问的日志记录)打开日志记录,然后您可以查看是否尝试访问其他计算机。

如果您只是测试,那么我建议在组件服务中的com对象上使用“作为交互式用户运行”设置,并确保在两台计算机上具有相同密码的用户。然后,您必须作为客户端计算机上的普通用户运行。也可以将用户设置为普通用户。

作为调试DCOM连接的一般建议:关闭所有防火墙等以确保连接正常,然后逐个打开安全措施,确保打开正确的端口并确保正确的用户拥有正确的权限。

答案 2 :(得分:0)

即使它可能不直接适用于您的具体案例,我也会向您提供我的经验。

在64位Windows 7上,我有一个用x64编译的exe和一个32位编译的dll。

COM对象存在于dll中。

exe(由“普通”用户启动)创建COM对象(在同一台计算机上),要求IUnknown并且创建成功。然后,exe通过QueryInterface请求不同的界面,并且失败并显示E_ACCESSDENIED

如果我“以管理员身份”启动了exe,那么QueryInterface将返回S_OK

我没有进一步调查,我怀疑有一些关于32位64位交互的政策。