2016-04-24 5 views
-1

(文書化されていない)ITrayNotifyインターフェイスを使用する必要があります。 Windows 7で通常の/ UAC制限プロセスとして実行すると問題なく動作します。 ただし、管理者権限で実行すると、CoCreateInstanceコールは-2147221164 = $80040154 = REGDB_E_CLASSNOTREG = "Class not registered"を返します。 私は4つの異なるWindows 7システムで同じ結果をテストしました。これはx64とx86でも同じです。Windows 7のプロセスが昇格したときにITrayNotifyインターフェイスが動作しない(「クラスが登録されていません」)

これはどのように可能ですか? 昇格したプロセスに対してこのインターフェイスがブロックされていますか?そのための回避策はありますか?

重要な点については、コードの関連部分を参考にしてください。それはDelphiにありますが、それは関連性が高いとは言えません。

classGuid := StringToGUID('{25DEAD04-1EAC-4911-9E3A-AD0A4AB560FD}'); 
interfaceGuid := StringToGUID('{FB852B2C-6BAD-4605-9551-F15F87830935}'); 
result := CoCreateInstance(classGuid, nil, CLSCTX_LOCAL_SERVER, interfaceGuid, trayNotify); 

編集/使用上の注意:問題はインターフェースが少し異なっており、それが上昇し、非上昇の両方正常に動作のWindows 10または8に存在しません。この問題はWindows 7にのみ適用されます(Vistaについてはわかりませんが、XPには関係ありません)。

+2

* "(文書化されていない)ITrayNotifyインターフェイスを使用する必要があります。" *疑わしい。 –

+0

これは実際の質問に対してどのように有用な表彰や返信ですか?私は、文書化されていないインターフェイスは推奨されないことを理解します。しかし、これはここで問題ではありません。私は、このインタフェースの使用を必要とする状況はここでは関連性がないとは思わない。このインターフェイスは、XPから10まで、記述されたコンステレーションでは動作しません。文書化されていないインターフェースを目指しているので、質問を下落させるのは不合理です。 – CodeX

+0

私は質問に投票しませんでした。そして私のコメントはあなたの問題を解決するためにあなたが間違った道を取っているかもしれないと考えさせることを意図しています。 –

答えて

1

UAC制限のこのタイプは、次のサイトに記載されている:ITrayNotifyインタフェースの唯一の既知の実装では、内部クラスのEXPLORERによるものである

ITrayNotify

実装

、 Windowsタスクバーの通知領域をサポートするCTrayNotifyという名前です。 1つのインスタンスが内部的に作成されます。この同じインスタンスは、以下のCLSIDで作成可能なCOMクラスとして公開されている:

CLSID_TrayNotify {25DEAD04-1EAC-4911-9E3A-AD0A4AB560FD}

状況

ITrayNotifyインタフェースはEXPLORERによって実現されるバージョン6.00以降。余談として

ITrayNotify :: RegisterCallback

、ユーザーアカウント制御(UAC)が有効になっていると、プログラムがシステム特権で実行されている場合プログラムが失敗することに注意してください。 EXPLORERはCOMサーバーで、TRAYNOTはCOMクライアントです。しかし、EXPLORERは中程度の完全性しか持たないです。 UACに関するマイクロソフトの注記はプログラミングドキュメントとしては十分ではありませんが、完全性の低いCOMクライアントがより高いインテグリティのCOMサーバーと通信しようとしている状況に対処していますが、不思議なことにその逆についてはほとんど言及されていません。 より完全性の高いCOMクライアントは、完全性の低いプログラムからのウィンドウメッセージの受信から保護されているため、低い整合性のCOMサーバーから保護されています。後者の場合、マイクロソフトは、より完全性の低いソースからの予期されたメッセージに自身を開くために、より高い整合性のあるプログラムを明示的に提供します。 COMのための類似の規定を見つけることは、別の時間のための価値ある運動かもしれません。アプリがUACに上昇した場合

、それはITrayNotifyオブジェクトをホストアプリよりも高い権限で実行されている、ので、COMは、アプリケーションがオブジェクトを作成することはできません。

l容疑者マイクロソフトでは、Windows 7の独自のソフトウェアで同じ問題が発生し、実装がWindows 8以降で動作するように調整されている可能性があります。あなたはプライベートインターフェイス、afterallにアクセスしています。だから、マイクロソフトでは異なる行動が必要だったので、行動の変化は起こるはずです。

+0

詳細な分析をお寄せいただきありがとうございます!これは、この問題の背景を理解するのに役立ちます。私は、この問題を回避する簡単な方法があることを期待していました(昇格したプロセスで使用される代替CLSIDのようなものです)。だから、唯一の方法は、非昇格のプロセスでコードを実行することだと言いますか?私は新しい非昇格プロセス(http://stackoverflow.com/questions/514968/how-to-run-a-process-non-elevated-with-delphi2007)を実行する方法を知っていますが、私の知る限り、それは不可能です非昇格のプロシージャを呼び出すだけです。これが可能かどうか知りませんか? – CodeX

+0

@CodeXこの情報があれば、私ははいと言わなければならないでしょう。Win7でインターフェイスを使用するには、低/中程度の整合性プロセスでコードを実行する必要があります。新しいプロセスを生成し、必要に応じてメインアプリケーションと通信するようにします。 –

+0

ありがとうございます。他の誰かが別の解決策を提示する場合に備えて、私はこれを数日間開いたままにしておきます。その後、おそらくこの問題の他の解決策がない理由を説明しているので、回答を受け入れられた回答としてマークします。 – CodeX

関連する問題