我有一些过去可以工作的代码,但最近停止了。它在一个 Adobe Reader 插件中,最新的 Reader 版本有一个“保护模式”,这导致了我的问题。
我的插件可以加载一些正常的 dll,这些 dll 在进程中加载:
MyNormalLib::IMyClassPtr foo;
HRESULT hr = foo.CreateInstance(__uuidof(MyNormalLib::MyClass));
但是当我尝试获取指向我的服务的 com 指针时(在同一台机器上运行):
MyOtherLib::IMyServicePtr bar;
HRESULT hr = bar.CreateInstance(__uuidof(MyOtherLib::MyService));
我得到E_ACCESSDENIED
了我的 HRESULT。
在 Adobe Reader X 出现之前,这一直很好用。如果没有保护模式,Adobe 可以正常运行,一切正常。在保护模式下,Adobe 会生成另一个 Reader 进程,但对其有一些限制。使用 Process Explorer 查看此内容,我可以看到父 Reader 进程的安全选项卡几乎所有内容都设置为强制;但是子阅读器进程将大多数组设置为“拒绝,强制”,一些“强制,限制”,有些只是强制。如果这很重要,我可以提供更多细节。
所有进程(我的服务和两个 Reader)都作为同一个用户运行——我。我有管理员权限,如果这很重要。
尝试访问我自己的服务时,什么会导致 AccessDenied 错误?我必须跳过哪些安全圈才能使其正常工作?