2009-07-02 15 views
27

से WOW64 रजिस्ट्री कुंजी को कैसे खोलें मेरे .NET अनुप्रयोग (किसी भी CPU) को 32-बिट प्रोग्राम द्वारा बनाए गए रजिस्ट्री मान को पढ़ने की आवश्यकता है। 64-बिट विंडोज़ पर यह रजिस्ट्री में Wow6432Node कुंजी के अंतर्गत चला जाता है। मैंने पढ़ा है कि आपको Wow6432Node पर हार्ड-कोड नहीं करना चाहिए, तो .NET के साथ इसका उपयोग करने का सही तरीका क्या है?64-बिट .NET अनुप्रयोग

उत्तर

12

उस स्थिति में जहां आपको 64 बिट प्रोग्राम में 32 बिट प्रोग्राम द्वारा लिखे गए मान को पढ़ने की आवश्यकता है, तो यह कठिन कोड है। बस क्योंकि वास्तव में कोई अन्य विकल्प नहीं है।

मैं निश्चित रूप से इसे एक सहायक समारोह में समझाऊंगा। उदाहरण

public RegistryKey GetSoftwareRoot() { 
    var path = 8 == IntPtr.Size 
    ? @"Software\Wow6432Node" 
    : @"Software"; 
    return Registry.CurrentUser.OpenSubKey(path); 
} 
+0

पर्याप्त मेला - धन्यवाद जेरेड! – marijne

+5

चेतावनी: एमएस कहता है कि यह दृष्टिकोण ("Wow6432Node" हार्डकोडिंग) समर्थित नहीं है। Http://msdn.microsoft.com/en-us/library/aa384232(VS.85).aspx – Richard

+6

-1 देखें: यह व्यवहार Windows 7/Windows Server 2008 R2 में टूट जाता है, क्योंकि वे इसके बजाय साझा रजिस्ट्री कुंजी का उपयोग करते हैं: http : //msdn.microsoft.com/en-us/library/aa384253 (VS.85) .aspx – Powerlord

16

के लिए सही तरीका देशी रजिस्ट्री API कॉल और RegOpenKeyEx/RegCreateKeyEx

+0

यह ध्यान दिया जाना चाहिए कि यह समाधान केवल पिनकोकिंग या सी ++ कोड का उपयोग करते समय मान्य है। – Kyle

+0

@ जेनॉक्स - यह निश्चित रूप से वैध समाधान है जब भी सी # जैसी भाषा का उपयोग करते हुए आप इसका उपयोग करने के लिए मूर्ख होंगे। –

6

को KEY_WOW64_32KEY झंडा गुजर ऐन्डर्स के जवाब का विस्तार करने के लिए किया जाएगा, वहाँ एक good example of wrapping the resulting handle in a .NET RegistryKey object on Shahar Prish's blog है - भी हालांकि टिप्पणी पढ़ने के लिए सुनिश्चित हो।

ध्यान दें कि the pinvoke.net wrapper of RegOpenKeyEx का अनचाहे उपयोग मुद्दों से भरा हुआ है।

+0

यह एक अच्छा समाधान है। – adzm

52

यदि आप लक्ष्य .Net संस्करण को v4 में बदल सकते हैं, तो आप नए OpenBaseKey फ़ंक्शन का उपयोग कर सकते हैं उदा।

RegistryKey registryKey; 
if (Environment.Is64BitOperatingSystem == true) 
{ 
    registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64); 
} 
else 
{ 
    registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32); 
} 
+1

यह समाधान मेरे विन 7 64 बिट + यूनिट परीक्षण के साथ बहुत काम करता है। धन्यवाद। – Jirapong

+2

रजिस्ट्री को पढ़ने का यह तरीका है। WoW6432Node को सीधे पढ़ा नहीं जाना चाहिए क्योंकि माइक्रोसॉफ्ट इसे अपने एपीआई के माध्यम से संभालता है और कहा है कि यह भविष्य में बदल सकता है। – Jason

+0

क्या होगा यदि आप 4.x में नहीं बदल सकते हैं? ऊपर विधि का प्रयोग करें? –

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