5

Process Monitorvsjitdebugger.exeを使用してレジストリ アクセスを調べていたところ、次の方法でレジストリにクエリを実行する場合があることに気付きました (一部の情報は省略されています)。

HKCU\Software\Classes\CLSID\{some-guid} NAME NOT FOUND  Desired Access: Read
...
HKCU\Software\Classes\CLSID\{some-guid}\TreatAs NAME NOT FOUND  Desired Access: Query Value
...
HKCU\Software\Classes\CLSID\{some-guid}\InprocServer32  NAME NOT FOUND  Desired Access: Read
...
HKCR\CLSID\{24E669E1-E90F-4595-A012-B0FD3CCC5C5A}\InprocServer32    SUCCESS Desired Access: Read

MSDN の TreatAs に関する情報は、元のサーバーの代わりに呼び出される別の COM サーバーの GUID を指定できることを示しています。

このキーに関する詳細情報を見つけることができず、自分の COM オブジェクトで使用することもできませんでした: 同じ COM オブジェクトの 2 つの異なる実装があります (2 つの別個の DLL で、2 つの別個の GUID を持っています)。 、そして私のプロセスがGUIDを介してオブジェクトを作成するとき、代わりに他のオブジェクトを作成したいと思います(TeatAsで指定されたGUIDを介して)。残念ながら、WindowsHKCU\Software\Classes\CLSID\{my-guid}\InprocServer32は最初に TreatAs を探すのではなく、すぐに を照会しようとするようです。

私の質問は基本的に、TreatAs のルールについてです。いつ、どのように照会されるのですか?

4

1 に答える 1

2

TreatAs機能は非常に単純に機能しCoCreateInstanceます。COM オブジェクトのインスタンスへの要求により、COM サブシステムは TreatAs キーをチェックし、見つかった場合は置換/エミュレーション クラスをインスタンス化し、要求された CLSID の代わりにそれを透過的に返そうとします。したがって、呼び出し元は、エミュレーション オブジェクトのインターフェイスを透過的に取得します。

この機能はめったに使用されませんが、まだ使用されています。EnumerateTreatAsClassesユーティリティを使用して、現在アクティブな TreatAs クラスを列挙できます。この機能は、COM クラスのインスタンス化をフックする方法の 1 つです。

于 2013-06-16T18:42:18.923 に答える