以前は機能していたコードがいくつかありますが、最近停止しました。Adobe Reader プラグインに含まれており、最新の Reader バージョンには「保護モード」があり、これが問題を引き起こしています。
私のプラグインは、インプロセスでロードする通常の 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 プロセスの [セキュリティ] タブでは、ほとんどすべてが必須に設定されていることがわかります。ただし、子リーダー プロセスには、ほとんどのグループが「拒否、必須」に設定されており、一部は「必須、制限付き」に設定され、一部は単に必須に設定されています。これが重要な場合は、詳細を提供できます。
すべてのプロセス (私のサービスとリーダーの両方) は、同じユーザー (私) として実行されます。それが問題であれば、私には管理者権限があります。
自分のサービスにアクセスしようとしたときに AccessDenied エラーが発生する原因は何ですか? これを機能させるには、どのようなセキュリティ フープを通過する必要がありますか?