web-dev-qa-db-ja.com

Windows 64ビットレジストリvs 32ビットレジストリ

Windows x64アーキテクチャについて聞いたところ、x86とx64アプリケーションの両方を実行するために、Windowsレジストリには2つの異なる/異なるセットがあります-x86アプリケーションがアクセスするものとx64アプリケーションがアクセスするものですか?たとえば、COMがx86のレジストリセットにCLSIDを登録する場合、x86/x64には異なるレジストリセットがあるため、x64アプリケーションはCLSIDでCOMコンポーネントにアクセスできません。

だから、私の質問は、上記のサンプルの私の理解が正しいかどうかです?また、x64アーキテクチャの2つの異なるレジストリセットについて、このトピックを学習するためのドキュメントをさらに入手したいと思います。 (検索しましたが、貴重な情報は見つかりませんでした。)

41
George2

少し前にこの問題に遭遇しました。簡単な答えは、64ビットマシンで32ビットアプリケーションを実行する場合、レジストリキーはWow6432Nodeの下にあるということです。

たとえば、レジ​​ストリ情報を以下に保存するアプリケーションがあるとします。

HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX

アプリケーションを64ビットバイナリとしてコンパイルし、64ビットマシンで実行すると、レジストリキーは上記の場所にあります。ただし、アプリケーションを32ビットバイナリとしてコンパイルし、64ビットマシンで実行する場合、レジストリ情報は次の場所にあります。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX

つまり、アプリケーションの32ビットバージョンと64ビットバージョンの両方を同じマシンで実行すると、それぞれが異なるレジストリキーのセットを参照することになります。

57
17 of 26

あなたの理解は正しいです。 x86アプリがx86 CLSIDにアクセスする必要はありません。とにかくこれらのコンポーネントを読み込むことができず、その逆もできません。

X86とx64の両方で使用するコンポーネントを作成する場合は、x86用とx64用にビルドされたdllのペアを作成し、レジストリの適切な部分に両方を登録する必要があります。 System32フォルダーのregsrv32.exeはx64コンポーネントを逆に登録し、SysWOW64フォルダーのregsrv32.exeはx86コンポーネントを登録します。

または、いずれかのCPUアーキテクチャで使用できる任意のCPU用の.NETアセンブリを構築します。

7
AnthonyWJones

これらは別個のレジストリではありません。一方は他方のサブノードであり、OSは32ビットアプリがキーを取得し、64ビットアプリがキーを取得するように仮想化を行います。

4
i_am_jorf

純粋な64ビットアプリケーションでCOMとして使用される.NETアセンブリを登録する方法は?

問題:デフォルトでは、ビルド設定で「COM相互運用機能の登録」を有効にすると、64ビットのタイプライブラリは登録されません。

解決策: 64ビットマシンのGACにないアセンブリを登録するには、cmdウィンドウを開いて次のようにします。

cd c:\windows\Microsoft.net\framework64\v2.x.xxxxx
regasm /codebase "path to your compiled Assembly dll"

これにより、ネイティブC++を使用して.NETアセンブリをCOMオブジェクトとしてインスタンス化するときに「クラスが登録されていないエラー」がなくなります。

1
Kashif Mushtaq

デスクトップとしてx64ビットマシンを実行しています。そして、私は異なるレジストリ設定で問題に遭遇したことはありません。

MSDNによれば、明らかに違いがあります: http://msdn.Microsoft.com/en-us/library/ms724072(VS.85).aspx

HTH

1
Nate

以下は、WOW64レジストリに関するWikipediaの記事で、探している情報の一部を提供します。

http://en.wikipedia.org/wiki/WOW64

1
Brawndo