2012-05-10 10 views
13

मुझे C++ में रजिस्ट्री प्रविष्टि "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}" खोलने की आवश्यकता है। इसमें जावा 64 बिट एप्लिकेशन शामिल है। उस रजिस्ट्री प्रविष्टि का पूरा पथ "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F86416024FF}" है।32 बिट अनुप्रयोग से 64 बिट रजिस्ट्री तक पहुंच

हम इस मार्ग को regedit के माध्यम से देख सकते हैं। मैं रजिस्ट्री खोलने के लिए

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"), 
    0, KEY_ALL_ACCESS, &hKey) 

का उपयोग करता हूं; लेकिन यह त्रुटि मान (2) देता है।

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall")... 

सफलता परिणाम देता है। मैं क्या कर सकता हूँ?

+0

क्या यह 32 बिट एप्लीकेशन है? –

उत्तर

-2

त्रुटि 2 का मतलब है कि रजिस्ट्री पथ मौजूद नहीं है।

सुनिश्चित करें कि कुंजी {26A24AE4-039D-4CA4-87B4-2F86416024FF} वास्तव में SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ स्थापना रद्द करें

+3

ओपी को यह कहते हुए कहते हैं, "हम regedit के माध्यम से इस पथ को देख सकते हैं।" – PlasmaHH

24

32 बिट और 64 अनुप्रयोगों के लिए रजिस्ट्री कुंजियों को अलग किया जाता है, आप कर सकते हैं के तहत मौजूद है अपने 32 बिट एप्लिकेशन से 64 बिट रजिस्ट्री तक पहुंच (सीधे) नहीं है। आपके मामले में आवश्यक बिट हाइव रजिस्ट्री के 32 बिट भाग में मौजूद नहीं है, तो आप केवल मूल फ़ोल्डर तक पहुंच सकते हैं।

MSDN से:

पर 64-बिट Windows, रजिस्ट्री प्रविष्टियाँ के कुछ भागों 32-बिट अनुप्रयोग और 64-बिट अनुप्रयोगों के लिए अलग से संग्रहीत और अलग तार्किक रजिस्ट्री रजिस्ट्री पुनर्निर्देशक और रजिस्ट्री का उपयोग कर विचारों में मैप किया जाता है प्रतिबिंब, क्योंकि किसी अनुप्रयोग का 64-बिट संस्करण 32-बिट संस्करण की तुलना में विभिन्न रजिस्ट्री कुंजियों और मानों का उपयोग कर सकता है। साझा रजिस्ट्री कुंजियां भी हैं जिन्हें पुनर्निर्देशित या प्रतिबिंबित नहीं किया जाता है।

आप एमएसडीएन: Registry Keys Affected by WOW64 पर सूची पढ़ सकते हैं। दुर्भाग्य से SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall का उल्लेख नहीं किया गया है लेकिन यह भी प्रभावित है।

समाधान
आप क्या करना है स्पष्ट रूप से रजिस्ट्री के 64 बिट भाग का उपयोग करने के लिएRegOpenKeyEx पूछने के लिए है। यह आपके कॉल पर KEY_WOW64_64KEY ध्वज जोड़कर किया जा सकता है (आप KEY_WOW64_32KEY का उपयोग कर 64 बिट एप्लिकेशन से 32 बिट रजिस्ट्री तक पहुंच सकते हैं)। कृपया ध्यान दें कि यह ध्वज Windows 2000 पर समर्थित नहीं है, तो यदि आपका एप्लिकेशन उस (पुराने) संस्करण के साथ संगत होना चाहिए जो आपको केस प्रबंधित करना है।

अधिक जानकारी के लिए एमएसडीएन पर यह लिंक देखें: Accessing an Alternate Registry View

इसे आसान बनाने के लिए, बस से अपने कॉल बदलने के लिए: है कि आप बिना केवल अपने पथ के माध्यम से कुंजी का उपयोग कर सकते

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"), 
    0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey); 

नोट
नोट:

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"), 
    0, KEY_ALL_ACCESS, &hKey); 

को इस HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall का उपयोग कर किसी भी झंडे। क्योंकि Wow6432 नोड वर्चुअलाइज्ड नोड WOW64 द्वारा उपयोग किया जाता है लेकिन आपको इस पर भरोसा नहीं करना चाहिए, यह स्थिर है लेकिन इसे बदलने के अधीन कार्यान्वयन विवरण माना जाना चाहिए।

संदर्भ
- Registry Virtualization MSDN पर।
- पाठकों को इस पोस्ट पर दिलचस्प टिप्स मिलते हैं: http://poshcode.org/2470, यह पावरशेल के लिए है, लेकिन यह बताता है कि 32 बिट एप्लिकेशन से WMI डेटा (64 बिट रजिस्ट्री भाग के सापेक्ष) तक कैसे पहुंचे।

+0

धन्यवाद ... यह काम कर रहा है ... –

+0

@ adriano-repetti उस नोट के बारे में: Wow6432Node केवल वह स्थान नहीं है जहां 32 बिट कुंजी संग्रहीत हैं ? 64 बिट मोड में आप अपने पथ के माध्यम से 32 बिट कुंजी तक पहुंच सकते हैं, लेकिन दूसरी तरफ नहीं। – Valdimar

+0

@vladimir हां पथ के साथ आप 64 बिट ऐप से 32 बिट रजिस्ट्री तक बिना किसी झंडे तक पहुंच सकते हैं लेकिन विपरीत नहीं है। हालांकि झंडे के साथ आप दोनों तरीकों से कर सकते हैं। –

संबंधित मुद्दे