Why is RegOpenKeyEx() returning error code 2 on Vista 64bit?

57,899

Solution 1

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

Solution 2

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.

Solution 3

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

Share:
57,899
Tim Cooper
Author by

Tim Cooper

Updated on June 05, 2020

Comments

  • Tim Cooper
    Tim Cooper almost 4 years

    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?