3

以下方法是 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;
}
4

3 回答 3

3

当您收到 E_ACCESSDENIED 时,这意味着您有权限问题(不要浪费时间在防火墙或注册上 - 前者会引发错误,告诉您服务不可用,后者会告诉您该类未注册或所以)。COM 依赖于 Windows 权限,所以这是你应该关注的。

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

  1. 正如 daramarak 建议的那样,让服务器和客户端使用相同的域用户,或者使用相同密码的相同本地用户。
  2. 在客户端上,将此设置设置为“经典”。
  3. 使用DCOMCNFG为服务器的用户(如果客户端知道)授予额外的权限。
于 2011-06-28T08:24:09.097 回答
1

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

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

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

于 2011-06-28T08:09:05.520 回答
0

我给你我的经验,即使它可能不直接适用于你的具体情况。

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

COM 对象存在于 dll 中。

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

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

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

于 2012-03-17T08:56:20.440 回答