以下方法是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;
}发布于 2011-06-28 16:24:09
当你得到一个E_ACCESSDENIED,这意味着你有一个权限问题(不要浪费时间在防火墙或注册上--前者会抛出错误,告诉你服务不可用,后者会告诉你类没有注册)。COM依赖于Windows权限,因此这是您应该关注的问题。
在您的例子中,如果我理解正确的话,服务器实际上会调用客户端,以便获得正确的接口。为此,运行服务器的用户应该在客户端具有正确的权限。以下是一些建议:
按照daramarak的建议,让服务器和客户端使用相同的域用户,或使用相同密码的相同本地用户。在客户端上,使用DCOMCNFG.将this setting设置为"classic".
发布于 2011-06-28 16:09:06
这可能是因为另一台计算机上的正确权限错误。检查这一点的最简单方法是使用secpol打开日志记录(本地策略、审计策略,打开登录事件和对象访问的日志记录),然后您就可以看到您是否正在尝试访问另一台计算机。
如果您只是在测试,那么我建议您在组件服务中的com对象上使用"run as interactive user“设置,并确保您在两台计算机上拥有相同的用户和相同的密码。然后,您必须以普通用户身份在客户机上运行。专门将用户设置为普通用户也是可能的。
调试DCOM连接的一般建议是:关闭所有防火墙等以确保连接正常工作,然后逐个打开安全措施,确保您保持正确的端口打开,并且正确的用户具有正确的权限。
发布于 2012-03-17 16:56:20
我给你我的经验,即使它可能不直接适用于你的具体情况。
在64位的Windows7上,我有一个用x64编译的exe和一个32位编译的动态链接库。
COM对象驻留在dll中。
exe (由“普通”用户启动)创建COM对象(在同一台计算机上),请求IUnknown,并且创建成功。然后,exe通过QueryInterface请求不同的接口,并使用E_ACCESSDENIED失败。
如果我以管理员身份启动可执行文件,则QueryInterface将返回S_OK。
我没有进一步调查,我怀疑有一些关于32位- 64位交互的策略。
https://stackoverflow.com/questions/6503136
复制相似问题