De ce RegOpenKeyEx() returnează codul de eroare 2 pe Vista 64bit? (Programare, C++, Winapi, Windows Vista, Registru, Wow64)

Tim Cooper a intrebat.

Am făcut următorul apel:

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

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

Nu reușește cu codul de eroare 2 („File not found”) chiar dacă „regedit” arată că cheia există. Acest cod a funcționat întotdeauna pe XP 32bit. De ce este „fișier nedescoperit” când este clar că există?

5 răspunsuri
Tim Cooper

Am descoperit că aș putea să-mi rezolv problema folosind steagul: KEY_WOW64_64KEY , ca în:

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

Pentru o explicație completă: Datele aplicațiilor pe 32 și 64 de biți în registru

Frode Lillerud

Pe un sistem Windows pe 64 de biți, Registrul este de fapt împărțit în două părți. O secțiune este utilizată de procesele pe 64 de biți, iar o parte de procesele pe 32 de biți.

De exemplu, dacă o aplicație pe 32 de biți scrie în mod programatic în ceea ce crede că este HKLMSOFTWARECompanyApplication, este de fapt redirecționată de către stratul WoW64 către HKLMSOFTWAREWow6432NodeCompanyApplication.

Astfel, atunci când rulați aplicația pe 32 de biți și apelați RegOpenKeyEx, aceasta lucrează de fapt cu dosarul Wow6432Node, și nu cu nodul obișnuit SOFTWARE.

Comentarii

  • Rețineți că nu trebuie să vă bazați pe faptul că cheia se numește „Wow6432Node”. Accesați cealaltă vizualizare a registrului folosind stegulețele pentru RegOpenKeyEx în schimb. –  > Por Billy ONeal.
GMG

Trebuie să compilați cu „Use Multi-Byte Character Set” sau să transformați șirul de caractere din cod în (LPWSTR).

Alex

Am avut o problemă similară.foloseam:

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

Asta nu a funcționat. Am încercat așa și a funcționat:

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

Comentarii

  • Niciodată nu introduceți doar caste pentru a închide compilatorul. Compilatorul a refuzat în mod corect să compileze prima fără cast. –  > Por Billy ONeal.
yue

da,win7 64B, adăugați un alt indicator KEY_WOW64_64KEY, va funcționa.dacă nu funcționează, consultați http://msdn.microsoft.com/en-us/library/ms724897(v=VS.85).aspx