32

I was making the following call:

result = RegOpenKeyEx(key, s, 0, KEY_READ, &key);

(C++, Visual Studio 5, Vista 64bit).

It is failing with error code 2 ("File not found") even though "regedit" shows that the key exists. This code has always worked on 32bit XP. Why is it "file not found" when it clearly is there?

Kevin Panko
  • 8,356
  • 19
  • 50
  • 61
Tim Cooper
  • 10,023
  • 5
  • 61
  • 77

5 Answers5

63

I discovered that I could solve my problem using the flag: KEY_WOW64_64KEY , as in:

result = RegOpenKeyEx(key, s, 0, KEY_READ|KEY_WOW64_64KEY, &key);

For a full explanation: 32-bit and 64-bit Application Data in the Registry

Kevin Panko
  • 8,356
  • 19
  • 50
  • 61
Tim Cooper
  • 10,023
  • 5
  • 61
  • 77
26

On a Windows 64-bit system the Registry is actually divided into two parts. One section is used by 64-bit processes, and one part by 32-bit processes.

For example, if a 32-bit application programatically writes to what it believes is HKLM\SOFTWARE\Company\Application, it's actually redirected by the WoW64-layer to HKLM\SOFTWARE\Wow6432Node\Company\Application.

So when you run your 32-bit application and call RegOpenKeyEx it's actually working against the Wow6432Node\ folder, and not the regular \SOFTWARE node.

Frode Lillerud
  • 7,324
  • 17
  • 58
  • 69
  • 2
    Note that you should not rely on the key being called "Wow6432Node". Access the other registry view using the flags to `RegOpenKeyEx` instead. – Billy ONeal Jul 29 '11 at 17:46
1

You have to compile with "Use Multi-Byte Character Set" or cast string in code to (LPWSTR)

GMG
  • 1,498
  • 14
  • 20
0

I had a similar problem. I was using:

dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                                   (LPWSTR)"SOFTWARE\\0test",
                                   0,
                                   WRITE_DAC ,
                                   &hKey);

That didn't work. I tried it like this and it worked:

dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                                   _T("SOFTWARE\\0test"),
                                   0,
                                   WRITE_DAC ,
                                   &hKey);
Bill the Lizard
  • 398,270
  • 210
  • 566
  • 880
Alex
  • 79
  • 4
  • 7
    Never just insert casts to shut up the compiler. The compiler correctly refused to compile the first one without a cast. – Billy ONeal Jul 29 '11 at 17:47
0

yes,win7 64B,add further flag KEY_WOW64_64KEY ,it will work. if not work, refer to http://msdn.microsoft.com/en-us/library/ms724897(v=VS.85).aspx

yue
  • 9
  • 1