2011-11-21 7 views
9

मैं विंडोज 7 रजिस्ट्री समस्या पर फंस गया हूं और विभिन्न प्रश्न और उत्तर मुझे वहां से कुछ रास्ता प्राप्त करते हैं, मैंने देखा है कि मैंने अपने विशेष मुद्दे को संबोधित किया है। मुझे नहीं पता कि अन्य विंडोज़ संस्करण इस समस्या को प्रभावित करते हैं, लेकिन हम सभी में win7x64 मशीनें हैं।64 बिट मशीन पर HKCU में 32 बिट रजिस्ट्री मानों को मैं ठीक से क्यों नहीं पढ़ सकता?

हमारे पास हमारे काम पर कुछ प्रकार के टूल्स हैं, कुछ सी ++, कुछ सी #, कुछ पायथन (2.6), आदि। हम 32 और 64 बिट टूल्स का मिश्रण भी चलाते हैं। अतीत में, हमने खुशी से HKLM में रजिस्ट्री जानकारी संग्रहीत की है। हम एचकेसीयू में सामान को स्थानांतरित करने पर काम कर रहे हैं। हमने यह करने के बारे में बहुत सी चर्चा की है कि ऐसा करने के लिए, यूएसी पर प्रभाव पड़ता है, आदि। हम वास्तव में इस कदम को आजमाकर बनाना चाहते हैं। उस ने कहा:

हमें एचकेसीयू/सॉफ्टवेयर/कंपनी एबीसी/ऐप से रजिस्ट्री कुंजी पढ़ने/लिखने में परेशानी हो रही है। हमारे पास पाइथन में एक सेटअप ऐप लिखना है जो _winreg का उपयोग कर उपरोक्त स्थान पर रजिस्ट्री कुंजी लिखता है। चाहे हम KEY_WRITE | KEY_WOW64_32KEY या केवल KEY_WRITE निर्दिष्ट करते हैं, मान एचकेसीयू/सॉफ्टवेयर/WOW6432Node/companyABC/एप पर writte प्राप्त करते हैं। ठीक।

तब मेरे पास एक सी # ऐप है जो इन मानों को पढ़ने की कोशिश करता है। Microsoft.Win32.Registry का उपयोग करके, मैं उपकुंजी ('HKCU/Software/CompanyABC/App') खोलता हूं और मुझे अपने मान नहीं दिखते हैं। यह पता चला है कि मैं निम्नलिखित व्यवहार देख रहा हूं:

  • HKLM से रजिस्ट्री कुंजियों को पढ़ने/लिखते समय, यह सब कुछ बस काम करता है। पायथन ऐप एचकेएलएम/सॉफ़्टवेयर/वाह 6432 नोड/कंपनी एबीसी/एप को लिखेगा, और सी # कोड उस स्थान से पढ़ेगा। यह सब भी उचित समझ में आता है, यह देखते हुए कि हम अपने सी # ऐप्स कैसे बना रहे हैं, और पाइथन
  • के माध्यम से रजिस्ट्री मानों को लिखना एचकेसीयू से रजिस्ट्री मानों को पढ़ना/लिखना, मुझे अलग-अलग व्यवहार मिलते हैं। _winreg फ़ंक्शन HKCU/Sofrware/Wow6432Node/CompanyABC/ऐप पर लिखेंगे, लेकिन सी # ऐप HKCU/Software/CompanyABC/एप से पढ़ेगा। सी # ऐप एक x86 ऐप के रूप में बनाया गया है (कोई भी CPU नहीं और x64 नहीं) इसलिए मुझे लगता है कि ऐप को wow6432Node पर ठीक से रीडायरेक्ट किया जाएगा, लेकिन ऐसा प्रतीत नहीं होता है।

कुछ जांच के बाद, ऐसा लगता है कि एचकेसीयू/सॉफ्टवेयर अलग है। This आलेख इंगित करता है कि यह क्षेत्र "साझा" है और पुनर्निर्देशित नहीं है। यदि ऐसा है, तो मुझे समझ में नहीं आ रहा है कि क्यों हमारे पायथन ऐप (फिर से, _winreg का उपयोग करके) HKCU में किसी स्थान पर लिख रहा है जो Wow6432Node का उपयोग करता है - ऐसा लगता है कि इसे बिना पुनर्निर्देशन के इसे लिखना चाहिए। मुझे लगता है कि यह _winreg में एक बग हो सकता है।

मैं वास्तव में हमारे उपकरणों में स्पष्ट रूप से WOW6432Node पर काम करने से बचना चाहता हूं, लेकिन यही वह जगह है जहां मैं आज हूं। क्या कोई मुझे बता सकता है कि 32 बिट हाइव में हार्ड कोड किए गए पथों का सहारा लेने के बिना मैं 32 और 64 बिट प्रक्रियाओं से रजिस्ट्री एक्सेस को एचकेसीयू में सही तरीके से कैसे एक्सेस कर सकता हूं?

+0

जब मैंने पहली बार विंडोज विस्टा में स्विच किया, तो संपूर्ण रजिस्ट्री वर्चुअलाइजेशन सिस्टम (32/64-बिट मुद्दों के शीर्ष पर) ने मुझे फिर से रजिस्ट्री का उपयोग करने का फैसला नहीं किया। मैं समझता हूं कि यह संभव नहीं हो सकता है, लेकिन यदि आप * कुछ और स्विच कर सकते हैं (उदा। कॉन्फ़िगरेशन फ़ाइल), तो मैं दृढ़ता से ऐसा करने की अनुशंसा करता हूं। –

+0

इसे पुन: उत्पन्न नहीं कर सकता है। मेरे लिए, पायथन 2.6।विंडोज 7 64 बिट पर 6 (32 और 64 बिट) एचकेसीयू/सॉफ्टवेयर/कंपनी एबीसी/एप से अपेक्षित के रूप में पढ़ने/लिखने के लिए (एचकेसीयू/सॉफ्टवेयर/WOW6432Node/companyABC/एप नहीं)। – cgohlke

+0

धन्यवाद cgohlke। मैं यहां क्या हो रहा है पर एक और नजर डालेगा। मैं अनुवर्ती की सराहना करता हूं। – Mark

उत्तर

4

मैं इस प्रश्न पर टिप्पणियों से समझता हूं कि इस समस्या का सामना करने वाले किसी भी व्यक्ति के लिए, आप Microsoft.Win32.OpenBaseKey का उपयोग कर सकते हैं यह निर्दिष्ट करने के लिए कि रजिस्ट्री के 64 या 32-बिट हिस्से को खोलने के दौरान 64-बिट मशीन भले ही आपकी प्रक्रिया 32-बिट प्रक्रिया के रूप में चल रही हो।

यदि आप हमेशा रजिस्ट्री के गैर-WOW6432Node अनुभाग में कुंजी का उपयोग करना चाहते हैं, तो आप ओपनबेसके के व्यू पैरामीटर को RegistryView पर सुरक्षित रूप से सेट कर सकते हैं। रजिस्ट्री 64। यह 64 और 32-बिट ओएस दोनों पर सही ढंग से काम करेगा।

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