2012-04-27 3 views
2

아래 C++/CLI 코드는 nullptr을 pKey로 반환합니다.OpenSubKey는 C++에서와 다른 동작을합니다.

RegistryKey^ pKey = Microsoft::Win32::Registry::LocalMachine->OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Folders"); 

아래 C#을 코드는 PKEY에 대한 유효한 포인터를 반환한다.

RegistryKey pKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Folders"); 

두 코드 조각은 언어 차이 외에 완전히 똑같습니다.

x64에서 C++ 코드를 작성하면 키를 찾을 수 있습니다. 그래서 내 질문에 지금 32 비트 빌드 때 어떻게 열쇠를 찾을 수 있습니까? 두 빌드에서 모두 찾아야합니다.

감사합니다.

+0

와 C++에서 열려 있으니, 정말 대답으로이를 게시 할 수 없습니다, 그러나에 전달되는 문자열 인수에 차이가 있다고 할 수있다 ? 아마도 C++/CLI 값은 ASCII 문자열로 전달되며 C# 코드는 ASCII 인코딩을 사용하지 않습니다. – BTownTKD

답변

7

이것은 플랫폼 타겟의 부작용입니다. 64 비트 운영 체제에서 HKLM/Software 키는 32 비트 프로세스의 경우 HKLM/Software/Wow6432Node로 리디렉션됩니다. 당신이 찾고있는 특정 키가 존재하지 않는 곳.

C# 코드는 AnyCPU를 대상으로하므로 64 비트 모드로 실행되기 때문에 C# 코드가 작동하는 것은 좋을 수 있습니다. 그리고 Win32를 대상으로하기 때문에 C++/CLI 코드가 작동하지 않습니다. C++/CLI를위한 AnyCPU 모드가 없으므로 명시 적으로 x64와 Win32 중 하나를 선택해야합니다. 네이티브 코드가 포함 된 C++/CLI 어셈블리의 부작용

.NET 4에서 RegistryKey 클래스에는 레지스트리보기를 지정할 수있는 추가 OpenBaseKey() 메서드가 있습니다. 이전 버전에는 간단한 해결 방법이 없습니다. C++/CLI 프로젝트에 x64 플랫폼을 추가하는 것을 고려하십시오. 아니면 C++/CLI의 강점 인 native winapi 함수를 사용하십시오.

+0

네이티브 함수 RegOpenKeyEx를 사용하고 네 번째 인수 인 samDesired에 KEY_WOW64_64KEY를 인수 분해하면 64 비트 시스템에서 실행되는 32 비트 빌드에서 레지스트리에 액세스 할 수 있습니다. –

2

표준 변형 난 그냥 spitballing있어

LONG lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Folders", 0, KEY_READ, &hKey); 
관련 문제