问题
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?
回答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
回答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.
回答3:
You have to compile with "Use Multi-Byte Character Set" or cast string in code to (LPWSTR)
回答4:
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);
回答5:
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
来源:https://stackoverflow.com/questions/252297/why-is-regopenkeyex-returning-error-code-2-on-vista-64bit