5

次のコードを使用して、Windows Explorer Shell のバンド サイト サービスにアクセスしています。

Guid GUID_TrayBandSiteService = new Guid(0xF60AD0A0, 0xE5E1, 0x45cb, 0xB5, 0x1A, 0xE1, 0x5B, 0x9F, 0x8B, 0x29, 0x34);
Type shellTrayBandSiteService = Type.GetTypeFromCLSID(GUID_TrayBandSiteService, true);
site = Activator.CreateInstance(shellTrayBandSiteService) as IBandSite;

ほとんどの場合、それはうまく機能します。ごくわずかな割合 (1% 未満) で、Activator.CreateInstance の呼び出しで次の例外がスローされます。

System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {F60AD0A0-E5E1-45CB-B51A-E15B9F8B2934} failed due to the following error: 80040154.
  at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
  at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
  at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
  at System.Activator.CreateInstance(Type type, Boolean nonPublic)

エラー コードを調べたところ、サービスが登録されていないようです。コールはしばらくすると正常に機能し、CLSID は によって提供されるため、実際にはそうではないことは確かですexplorer.exe

私は困惑しています。Activator.CreateInstance が失敗する原因は何ですか?

4

3 に答える 3

1

許可?はい、中程度の整合性アプリケーションの COM オブジェクトにアクセスする高整合性アプリケーションには問題があります。私のウェブサイトのどこかに、まさにこれのデモンストレーションがあります。ああ、でもTrayNotifyクラスでは、そうではありませんTrayBandSiteService。簡単に読んだばかりの何かを理解するのにあまり時間を費やしていないことを願っています.

とにかく、このの最後の段落を参照してください。ここから引用します。

余談ですが、ユーザー アカウント制御 (UAC) が有効になっており、プログラムが昇格された特権で実行されている場合、プログラムは失敗することに注意してください。EXPLORER は COM サーバーであり、TRAYNOT (デモ プログラム) は COM クライアントです。それでも、EXPLORER の完全性は中程度です。Microsoft の UAC に関するメモ (プログラミング ドキュメントとして数えられるほど実質的ではない) は、整合性の低い COM クライアントが整合性の高い COM サーバーと通信しようとする状況を扱っていますが、不思議なことに、その逆についてはほとんど語られていません。整合性の高い COM クライアントは、整合性の低い COM サーバーから保護されます。これは、整合性の高いプログラムが、整合性の低いプログラムからのウィンドウ メッセージの受信から保護されるのと同じです。後者については、Microsoft は、整合性の高いプログラムに、整合性の低いソースからの予想されるメッセージに対して自身を開く明示的な手段を提供します。COM の同様の規定を見つけることは、別の機会に行う価値のある作業になる可能性があります。

残念ながら、私は時間を見つけることができませんでした。

于 2010-09-22T04:38:56.223 に答える
0

Activator.CreateInstance(typeof(MyType)) スタンドアロンの Windows アプリケーションでコードを実行しようとすると、正常に動作します。wcfサービスの下のクラスライブラリで同じコードを実行しようとすると失敗します

于 2011-12-20T11:46:05.903 に答える
0

ここで TrayBandSiteService に関する説明を見つけました: http://www.geoffchappell.com/viewer.htm?doc=studies/windows/shell/explorer/classes/traybandsiteservice.htm

Geoff Chappell が正しければ、私のマシンと同じ問題である可能性があります。時々、エクスプローラーが再起動し、その瞬間に TrayBandSiteService にアクセスできない場合があります。

于 2010-05-26T18:11:40.033 に答える