2011-07-09 7 views
1

私は、Visual Studio 2008の展開(セットアップ)プロジェクトを使用してインストーラを構築しています。このプロジェクトには、管理者だけが実行できるように、起動条件「特権」があります。第三者が提供するマージモジュールを使用してCOMコンポーネントを登録します。 COMコンポーネントは、.NETインターオペラDLLを介して公開されます。このDLLは、インストーラをビルドしているプログラムによって使用されます。 (具体的には、これはQBFCフレームワークをインストールするIntuitマージモジュールです)。COMコンポーネントはどのように途中で登録できますか?

インストールが完了すると、COMコンポーネントをロードできません。エラーは「クラスが登録されていません」です。しかし、レジストリに行くと、正しいエントリがすべてHKEY_CLASSES_ROOT\CLSID\{the class id}の下にあることがわかります。クラスIDはエラーメッセージのクラスIDと一致します。管理モードでコマンドプロンプトを開き、Regsvr32を使用しているCOMサーバーをDLLに再登録すると、すべてが修正されますが、変更は表示されません。KEY_CLASSES_ROOT\CLSID

プロセスモニターを使用してシステムを調べるとクラスが登録されていないエラーを取得している場合、CLSIDが確実に存在するにもかかわらず、CLSIDをオープンしようとするとアプリケーションに「名前が見つかりません」というエラーが表示されていることがわかります。私はこれがパーミッションと関係があると思っています。別の理論では、おそらく「登録されていないクラス」メッセージが従属コンポーネントから来ている可能性がありますが、これはプロセスモニタで見ていることを説明していません。

これらのテスト結果は、すべてWindows 7 Ultimate 32ビットオペレーティングシステムからのものです。

この問題の最下部に進むにはどのような手順が必要ですか?

+0

HKLM \ Software \ Wow6432Node \ Classes \ CLSIDにあります。 32ビットCOM登録キーのホーム。 –

+0

ハンス、それは良いキャッチですが、私は私のテスト結果が32ビットイメージからのものだと言及するのを忘れていました。 –

+0

"32ビットイメージ"が32ビットCOMサーバーを意味する場合は、間違いなくWow6432Nodeを見たいと思っています。これを64ビットオペレーティングシステムで実行するかどうかなどの重要な詳細を推測しないようにしてください。 –

答えて

2

コンポーネントカテゴリキャッシュに問題がある可能性があります。それは長いですが、インストールにステップを追加してHKEY_CLASSES_ROOT\Component Categories\の下にあるキーを削除すると役立ちますか?その場合は、削除する必要のあるcomcatキャッシュ(つまり、オブジェクトが使用しているキャッシュ)を把握する必要があります。

もう一つは、レジストリ全体をエクスポートし、インストールして、レジストリをエクスポートし、regsvr32のことを行い、レジストリをエクスポートします。次に、エクスポートされたレジストリファイルの各リビジョンをwindiffします。それはあなたに少なくとも何が変わったのかを知らせるかもしれません。

最後に、64ビットマシンであれば、正しく64ビット登録を行っていることを確認してください。

+1

レジストリ全体をエクスポートしてdiffを実行することは、これをどのように並べ替えるかです。これは私のレジストリの知識が古くなったことを認識させました。たとえば、HKEY_CLASSES_ROOTキーは、ユーザーコンテキストに応じて、他のソースキーからのデータをマージすることによって完全にシミュレートされます。レジストリの完全なエクスポートを行うと、HKEY_LOCAL_MACHINE \ Software \ Classesではなく、現在のユーザーハイブで登録が行われていることが明らかになりました。 –

+0

ええ、これについてMSDNにいくつかの良い記事があります。例えば、http://msdn.microsoft.com/en-us/library/aa965884(v=vs.85).aspx –

+1

http://msdn.microsoft.com/en-us/library/windows/desktopも参照してください。 /ms724498(v=vs.85).aspx –

関連する問題