Why is RegOpenKeyEx() returning error code 2 on Vista 64bit?
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)
Tim Cooper
Updated on June 05, 2020Comments
-
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?