2011-03-04 20 views
3

私は、Visual Studio 2008でATLウィザードを使用して新しい単純なCOMオブジェクトを作成しました。オブジェクトには、単一のクラスと簡単なメソッドがあります。 ATLウィザードは、私のクラスのために.rgsファイルを生成しました。Windows7では、regsvr32はHKCR CLSIDに書き込みません

XPマシンでregsvr32 Simple.dllを実行すると、クラスが登録され、情報がHKCR\Simple.SimpleObjectに表示され、期待通りにHKCR\CLSID\{guid}に表示されます。

しかし、私の64ビットWindows 7マシンでは、それは同じではありません。私はHKCR\Simple.SimpleObjectの部分が表示される管理者としてregsvr32を実行します。しかし、HKCR\CLSIDの部分は決してそこに到着しません。そして、私は新しいインスタンスを作成することはできません。 (私はSystem32とSysWOW64の両方でregsvr32を試してみましたが、同じ効果があります)

なぜをHKCR\CLSIDに入れるのですか?

答えて

6

HKCRは、HKLM \ SOFTWARE \クラスの別名ですが、それはすべてを表示しません。登録された{guid}については、HKLM¥Software¥Wow6432Node¥Classes¥CLSIDを参照してください。これはc:\ system32 \ syswow64 \ regsvr32.exeが書き込む場所です。

あなたはすでにそれを試したことに言及しました。本当に間違っていることがあります。あなたは任意のバージョンのRegsvr32.exeを実行して同じDLLを登録することはできません。 32ビットDLLは64ビットプロセスではロードできません。言い換えれば、Regsvr32.exeの64ビットバージョンが32ビットCOMサーバーを登録する方法はありません。そして、その逆です。なぜあなたはエラーメッセージが表示されないのか、ここから推測できません。あなたは何とか実際にRegsvr32の正しいバージョンを実行していないという唯一の純粋な説明です。

これを本当にデバッグするには、SysInternalsのProcMonユーティリティを使用します。そのトレースは、ATLレジストラがどのようにレジストリにキーを記述しているかを示しています。

+0

私はプロセスモニタを使用しましたが、明らかにフィルタ条件が不良です。それゆえ、私はWow64部品を見逃してしまった。ありがとう! – leiflundgren

4

32ビットアプリケーションとコンポーネントがレジストリの別の部分にリダイレクトされています。 64ビット版のregeditでレジストリを参照している場合は、期待どおりの場所でそれを見つけることはできません。

したがって、コンポーネントはHKEY_CLASSES_ROOT\Wow6432Node\CLSIDに登録する必要があります。

このレジストリパスでは、すべての32ビットアプリケーションで表示される必要があります。

も参照してください:

1

ここで同様の問題が発生しましたが、Regsvr32はエラーを報告していませんでしたが、何もレジストリに書き込まれていないようです。

「管理者として」を実行すると、このトリックが実行されたようです。

関連する問題