2010-01-21 5 views
6

मेरे पास 32-बिट प्रतिलिपि इंस्टॉलर है। इसका उपयोग करने के लिए मुझे 32- और 64-बिट अनुप्रयोगों को स्थापित और अनइंस्टॉल करने में सक्षम होना चाहिए।मैं 32-बिट पर्ल को 64-बिट विंडोज रजिस्ट्री को कैसे पढ़ूं?

32- और 64-बिट स्थापित करना ठीक है। 32-बिट अनइंस्टॉल करना भी ठीक है।

हालांकि, 64-बिट अनुप्रयोगों को अनइंस्टॉल करते समय मुझे कोई समस्या है।

एप्लिकेशन केवल नियंत्रण कक्ष में प्रोग्राम निकालें प्रोग्राम में देखे गए एप्लिकेशन का नाम जानता है। उदाहरण के लिए यह "विनज़िप 14.0" हो सकता है जो विनज़िप के लिए प्रदर्शन नाम है।

मैं अनइंस्टॉलेशन के लिए निम्न दृष्टिकोण का उपयोग करता हूं: मैं HKLM/Software/Microsoft/Windows/CurrentVersion/Uninstall पर जाता हूं और यह देखने के लिए वहां मौजूद कुंजी को पार्स करता हूं कि Winzip मेल खाता है या नहीं। यदि ऐसा है तो मुझे वहां से अनइंस्टॉल स्ट्रिंग मिलती है।

my $register = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; 
    $HKEY_LOCAL_MACHINE->Open($register,$hKey)|| die $!; 
    #Then parse all the nodes and fetch the uninstall string 

तो आवेदन एक 64-बिट स्थापना है, तो स्थापना रद्द करने की जानकारी HKLM/Software/Microsoft/Windows/CurrentVersion/Uninstall में निवास करेंगे।

हालांकि ऊपर दिए गए पर्ल संस्थापक कोड से HKLM/Software/WOW6432Node/Microsoft/Windows/CurrentVersion/Uninstall
को पढ़ने के लिए कोशिश कर रहा है और यह वहाँ स्थापना नहीं मिल रहा है।

तो 64-बिट हाइव में पाए गए रजिस्ट्री मान को पढ़ने के लिए मैं 32_ बिट प्रक्रिया में पर्ल कोड कैसे चला सकता हूं? मुझे RegOpenKey() एपीआई पता है जो KEY_WOW64_64KEY पैरामीटर लेता है। लेकिन चूंकि यह एक विंडोज एपीआई है, मुझे नहीं पता कि इससे मदद मिलेगी या नहीं। फिर भी, क्या कोई अन्य विकल्प है?

+0

संभावित डुप्लिकेट [पर्ल में विंडोज रजिस्ट्री से पढ़ना] (http://stackoverflow.com/questions/30269931/reading-from-windows-registry-in-perl) –

उत्तर

2

हां, आपको KEY_WOW64_64KEY का उपयोग करना होगा, 32-बिट प्रक्रिया के लिए कोई अन्य कामकाज नहीं है। पर्ल से सीधे Win32 एपीआई को कॉल करना संभव है, this web page से निर्णय लेना संभव है।

2

तुम भी, सीधे reg उपकरण कह सकते हैं बैच फ़ाइल के बजाय:

$WINDIR/system32/reg.exe 

यह Reg.exe के लिए डिफ़ॉल्ट स्थान जब ऑपरेटिंग सिस्टम के साथ शामिल है।

$WINDIR/sysnative/reg.exe 

32-बिट प्रक्रिया से निष्पादित होने पर यह मूल 64-बिट reg.exe का आभासी स्थान है।

+0

आप '/ reg: 64 पास कर सकते हैं 'या'/reg: 32' 32-बिट या 64-बिट reg.exe के लिए एक स्पष्ट पथ निर्दिष्ट करने से बचने के लिए reg.exe पर स्विच करें: https://support.microsoft.com/en-us/kb/ 948,698। फिर आपको केवल उस प्रकार की कुंजी (जिसे आपको शायद पता होना चाहिए) की देखभाल करने की आवश्यकता है और पर्ल स्थापित प्रकार भी नहीं है (जिसे आप संभवतः परवाह नहीं करते हैं)। – Ben

1

जैसा कि आप अपने प्रश्न में नोट करते हैं, specify a 64-bit or 32-bit registry views with the KEY_WOW64_64KEY flag पर संभव है।

The old Win32API::Registry can specify the 64-bit registry with KEY_WOW64_64KEY, लेकिन इन दिनों यह TieRegistry's object functions, जो कार्यक्षमता लपेटता उपयोग करने के लिए बेहतर है यह आसान रजिस्ट्री के साथ काम करने करने के लिए:

#!/usr/bin/perl -w 
use strict; 
use Win32::TieRegistry (Delimiter => '/'); 

print "registry 64-bit:\n"; 
my $mykey = new Win32::TieRegistry 
    'HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Uninstall', 
    { Access=>Win32::TieRegistry::KEY_READ()|0x0100, Delimiter=>'/' }; 

print "\tValues are:\n"; 
print join("\n\t\t", $mykey->ValueNames); 
print "\n"; 

#Getting a specific value's value 
#$mykeyval = $mykey->GetValue('Path'); 

print "\tFiltered subkeys are:\n\t\t"; 
print join("\n\t\t", grep(!/\{[-A-Fa-f0-9]+\}/, $mykey->SubKeyNames)); 
print "\n"; 

print "registry 32-bit explicit:\n"; 
$mykey = new Win32::TieRegistry 
    'HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Uninstall', 
    { Access=>Win32::TieRegistry::KEY_READ()|0x0200, Delimiter=>'/' }; 

print "\tValues are:\n\t\t"; 
print join("\n\t\t", $mykey->ValueNames); 
print "\n"; 

#Getting a specific value's value 
#$mykeyval = $mykey->GetValue('Path'); 

print "\tFiltered subkeys are:\n\t\t"; 
print join("\n\t\t", grep(!/\{[-A-Fa-f0-9]+\}/, $mykey->SubKeyNames)); 
print "\n"; 

यह परिणाम देता है के रूप में 32-बिट और 64 के लिए उम्मीद -बिट कुंजी, और इसके अतिरिक्त 32-बिट और 64-बिट पर्ल दोनों में वैसे ही काम करना चाहिए (वैसे भी सिद्धांत में)।

नोट: मुझे संकलन त्रुटियों को रोकने के लिए पर्ल के मेरे संस्करण में KEY_READ() फ़ंक्शन के लिए पूर्ण नामस्थान निर्दिष्ट करने की आवश्यकता है, और मुझे यकीन नहीं है कि 0x0100 और 0x0200 स्थिरांक के लिए नामित मान हैं या नहीं, तो यह है संभव यह सुंदर हो सकता है। लेकिन यह काम करता है!


(my solution to my question about not being able to read the registry से अनुकूलित, पूछा से पहले मुझे पता था कि मेरी समस्या 64 बिट बनाम 32 बिट से संबंधित था)।

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