以下方法是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;
}
答案 0 :(得分:3)
当您获得E_ACCESSDENIED时,这意味着您有权限问题(不要在防火墙或注册上花费时间 - 前者会引发错误,告诉您服务不可用,而后者会告诉您课程是没有注册等)。 COM依赖于Windows权限,因此这是您应该关注的内容。
在您的情况下,如果我理解正确的情况,服务器实际上调用客户端,以获得正确的接口。为此,运行服务器的用户应该在客户端具有正确的权限。一些建议:
答案 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位交互的政策。