0

C#.NET1.1アプリケーションでCOMオブジェクトを使用しています。COMオブジェクトがクライアントマシンに登録されていない場合、例外が発生します。

CLSID {}のCOMオブジェクトが無効であるか、登録されていません。」(HRESULT:0x80040154)

zippy32を使用してCOMオブジェクトを登録する方法を知っています。要件は、登録されていないCOMオブジェクトを識別することです。COMオブジェクトの名前をハードコーディングするのではなく、COM Exception/HResultを使用して動的に識別します。何か案は?

4

3 に答える 3

1

Benjamin Podszun の回答へのコメントで言及されている状況を考えると、あなたのアプローチは次のようになります。

  • レジストリで CLSID を検索します ( HKEY_CLASSES_ROOT\CLSID\{...})
  • 見つからない場合は、一般的なエラー メッセージが表示されるようにスローします。
  • オブジェクトのタイプに応じて適切なサブキーを調べます (たとえば、インプロセス ネイティブ COM DLL/OCX の場合は InProcServer32)。デフォルト値は、DLL/OCX へのパスになります。
  • このパスの存在を確認し、ファイルの名前で適切なメッセージを作成します。

これにより、OCX/DLL が移動された場合に別のメッセージを表示できますが、登録されていない場合はもちろん役に立ちません。

また、一部のクライアント マシンでコンポーネントが移動/登録解除されている理由 (または5 つの理由!) を理解するのに時間を費やすことをお勧めします。たとえば、ユーザーがバージョン 1 をインストールしてからバージョン 2 をインストールしてから、バージョン 1 をアンインストールするというシナリオが考えられます。インストーラーの実装方法によっては、バージョン 1 をアンインストールすると、バージョン 2 に必要なコンポーネントが登録解除または削除される場合があります。

もう 1 つのアプローチは、インストーラーが通常のユーザーと管理者としてどのように動作するかを確認することです。

障害が発生したクライアント マシンでのイベントの正確なシーケンスを特定するのは少し難しいかもしれませんが、試してみる価値はあります。

于 2010-01-04T13:28:11.997 に答える