2009-05-15 4 views
37

Windows x64 아키텍처에서 x86과 x64 응용 프로그램을 모두 실행할 수 있도록하기 위해 x86 응용 프로그램과 x64 응용 프로그램에 액세스 할 수있는 두 개의 Windows 레지스트리가 있습니다. 접속하다? 예를 들어 COM이 레지스트리의 x86 세트에 CLSID를 등록하면 x86/x64에 다른 레지스트리 세트가 있기 때문에 x64 응용 프로그램은 절대로 CLSID로 COM 구성 요소에 액세스 할 수 없습니다.Windows 64 비트 레지스트리 v.s. 32 비트 레지스트리

내 질문은 위의 샘플에 대한 나의 이해가 올바른지 여부입니다. 또한 x64 아키텍처의 두 가지 레지스트리 집합에 대해이 항목을 배우기 위해 더 많은 문서를 얻고 싶습니다. (나는 몇 가지 검색을했지만 어떤 가치있는 정보를 찾을 수 없습니다.) 사전에

덕분에, 조지 내 바탕 화면과 같은 64 비트 머신을 실행

답변

52

오래 전에이 문제가 발생했습니다. 짧은 대답은 64 비트 컴퓨터에서 32 비트 응용 프로그램을 실행하면 레지스트리 키가 Wow6432Node 아래에 있다는 것입니다. 64 비트 바이너리로 응용 프로그램을 컴파일하고 다음 레지스트리 키는 64 비트 컴퓨터에서 실행하면

HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX 

: 예를 들어

,의 당신이 아래의 레지스트리 정보를 저장하는 응용 프로그램을 가정 해 봅시다 위의 위치에 있습니다. 당신이 32 비트 바이너리로 응용 프로그램을 컴파일 한 다음 레지스트리 정보가 지금 여기에 위치하는 64 비트 컴퓨터에서 실행하는 경우에는 :

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX 

이것은 당신이 32 비트 및 64 개 비트 버전 모두를 실행하면 것을 의미한다 동일한 컴퓨터에서 응용 프로그램을 실행하면 서로 다른 레지스트리 키 집합이 표시됩니다.

+2

빠른 질문, regsvr32를 사용하여 COM 구성 요소를 등록하는 경우 x86 또는 x64 레지스트리에 등록했는지 어떻게 알 수 있습니까? ocnfusion은 x86 레지스트리에 등록 된 경우 x64 응용 프로그램이 COM 구성 요소에 액세스 할 수 없습니까? – George2

+7

64 비트 시스템에는 regsrv32의 두 가지 버전이 있습니다. 하나는 64 비트 바이너리를 등록하고 하나는 Wow6432 노드에 32 비트 바이너리를 등록합니다. 이 Microsoft kb 문서는 다음과 같이 유용 할 수 있습니다. http://support.microsoft.com/kb/282747 –

+0

1. 32 비트 regsvr32를 사용하여 새 COM 구성 요소를 등록하면 COM 구성 요소가 x86 용으로 만들어 져야합니다 (64 비트 regsvr32를 사용하여 새로운 COM 구성 요소를 등록하십시오. COM 구성 요소는 x64 용으로 작성해야합니다.) - 32 비트 regsvr32를 사용하여 64 비트 COM 구성 요소를 등록하거나 64 비트 regsvr32를 사용하여 32 비트를 등록 할 수 없음을 의미합니다. COM 구성 요소), 맞습니까? 2. 64 비트 프로세스는 COM CLSID에 대한 x64 레지스트리에만 액세스 할 수 있었으며 32 비트 프로세스는 COM CLISD에 대한 x86 레지스트리에 액세스 할 수 있었으며 교차 액세스는 할 수 없었습니다. 제 이해가 정확합니까? – George2

1

당신에게 몇 가지 정보를 줄 수있는 WOW64 레지스트리에 위키 백과 문서가 당신이 찾고 있습니다 :

MSDN 당

는 분명히 차이가 있습니다 http://en.wikipedia.org/wiki/WOW64

+0

가정하자 나는 그때는 레지스트리의 x64 버전에 액세스 할 수 JITed해야 모든 CPU 위해 만들어진 닷넷 applicaiton을 가지고, 및 x64에서 실행 - 즉, 64 레지스트리에 등록 된 COM의 CLSID가, 그리고 나는 32를 등록하면 비트 COM 구성 요소를 .Net 응용 프로그램을 찾을 수 없습니까? 제 이해가 정확합니까? – George2

6

귀하의 이해가 정확합니다. 어쨌든 그 구성 요소를로드 할 수 없기 때문에 x64 응용 프로그램이 x86 CLSID에 액세스 할 필요가 없으며 반대의 경우도 마찬가지입니다.

x86 및 x64에서 사용할 구성 요소를 만들려면 x86 용으로 빌드 된 DLL과 x64 용으로 만든 DLL을 만들어 레지스트리의 해당 부분에 모두 등록해야합니다. System32 폴더의 regsrv32.exe는 x64 구성 요소를 반비례로 등록하고 SysWOW64 폴더의 regsrv32.exe는 x86 구성 요소를 등록합니다.

또는 CPU 아키텍처에서 사용할 수있는 모든 CPU에 대해 .NET 어셈블리를 빌드하십시오.

+0

@AnthonyWJones, 당신이 언급 한 모든 CPU 샘플 .Net에 관심이 있습니다. 모든 CPU에 대해 .Net 응용 프로그램을 만들고이를 x64에서 실행한다고 가정하면 x64 버전의 레지스트리 (예 : x64 레지스트리에 등록 된 COM의 CLSID)에 액세스하려면 JITed해야합니다. 제 이해가 정확합니까? 이 시나리오에서 – George2

+1

는 JIT 또는 .NET하지 CLSID가에게 코드가 실행되고있는 프로세스가이 CLSID가를 검색하는 데 사용할 설정을 결정 64 비트인지 그 사실을 조회 할 레지스트리의 어느 부분을 결정하는. 이것은 Windows에 설치된 COM 지원 라이브러리 안에서 자동으로 발생합니다. – AnthonyWJones

+0

1. regsvr32를 사용하여 새 COM 구성 요소를 등록 할 때 x86 레지스트리 또는 x64 레지스트리 또는 둘 다에서 등록합니까? 2. 64 비트 프로세스는 COM CLSID 용 x64 레지스트리에만 액세스 할 수 있으며 32 비트 프로세스는 COM CLISD 용 x86 레지스트리에 액세스 할 수 있으며 상호 액세스는 허용되지 않습니다. 제 이해가 정확합니까? – George2

4

그들은 별도의 레지스트리가 아닙니다. 하나는 다른 노드의 하위 노드이고 OS는 32 비트 응용 프로그램이 자신의 키를 받고 64 비트 응용 프로그램이 키를 가져 오도록 가상화를 수행합니다.

+0

이 항목 초보자에게 권장되는 수치는 무엇입니까? – George2

+1

위에 게시 된 MSND 기사가 아마도 가장 좋은 장소 일 것입니다. 나는 COM 구성 요소를 등록에 regsvr32를 사용하고있는 경우 http://msdn.microsoft.com/en-us/library/ms724072.aspx –

+0

빠른 질문, 우리는 어떻게 우리가 86 또는 64에서 COM 구성 요소를 등록 여부를 알고 계십니까 기재? 내 혼란은 x86 레지스트리에 등록하면 x64 응용 프로그램이 COM 구성 요소에 액세스 할 수 없게됩니까? – George2

1

순수 64 비트 응용 프로그램에서 COM으로 사용할 .NET 어셈블리를 등록하는 방법은 무엇입니까?

문제점 : 기본적으로 빌드 설정에서 "COM Interop에 등록"을 사용하면 64 비트 용 유형 라이브러리를 등록하지 않습니다.

솔루션 : 이 64 비트 시스템에 GAC에없는 조립, 개방 cmd를 창을 등록하고 수행하려면 : 기본 사용하는 경우

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

이 제거됩니다 "클래스는 오류를 등록하지" COM 개체로 .NET 어셈블리를 인스턴스화하는 C++.

+0

정확히 64 비트 혼합 모드 응용 프로그램이 실패하는 이유입니다. 어셈블리는 Visual Studio 2010에 등록 된 32 비트 COM입니다. 따라서 COM interop 등록 대신 위의 것처럼 regasm에 포스트 빌드 이벤트를 넣습니다 (/ TLB 사용). 세대 내 세대). 이 동작과 관련된 MSDN 문서가 있습니까? – DaBozUK

관련 문제