2009-05-15 23 views
37

मैंने विंडोज x64 आर्किटेक्चर पर सुना है, दोनों x86 और x64 एप्लिकेशन को चलाने के लिए समर्थन करने के लिए, विंडोज रजिस्ट्री के दो अलग/अलग सेट हैं - x86 एप्लिकेशन के लिए एक और दूसरा x64 एप्लिकेशन के लिए पहुंच? उदाहरण के लिए, यदि कोई COM रजिस्ट्री के x86 सेट में CLSID पंजीकृत करता है, तो x64 एप्लिकेशन CLSID द्वारा COM घटक तक कभी भी नहीं पहुंच पाएगा, क्योंकि x86/x64 में रजिस्ट्री के अलग-अलग सेट हैं?विंडोज 64-बिट रजिस्ट्री बनाम। 32-बिट रजिस्ट्री

तो, मेरा सवाल यह है कि उपर्युक्त नमूने की मेरी समझ सही है या नहीं? मैं x64 आर्किटेक्चर पर रजिस्ट्री के दो अलग-अलग सेटों के बारे में, इस विषय को जानने के लिए कुछ और दस्तावेज भी प्राप्त करना चाहता हूं। (मैं कुछ खोज किया था, लेकिन किसी भी महत्वपूर्ण जानकारी नहीं मिली।) पहले से

धन्यवाद, जॉर्ज

उत्तर

52

मैं इस मुद्दे में बहुत पहले नहीं चला था। संक्षिप्त जवाब यह है कि यदि आप 64 बिट मशीन पर 32 बिट अनुप्रयोग चलाते हैं तो यह रजिस्ट्री कुंजी Wow6432Node के अंतर्गत स्थित होती है।

HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX 

आप एक 64 बिट द्विआधारी के रूप में अपने आवेदन संकलन और एक 64 बिट मशीन तो रजिस्ट्री कुंजी हैं पर चला हैं:

उदाहरण के लिए, मान लीजिए कि आप एक आवेदन है कि के तहत अपने रजिस्ट्री जानकारी संग्रहीत करता है चलो उपरोक्त स्थान में। हालांकि, अगर आप एक 32 बिट द्विआधारी के रूप में अपने आवेदन संकलन और एक 64 बिट मशीन तो अपने रजिस्ट्री जानकारी अब यहाँ स्थित है पर चला:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX 

इसका मतलब यह है कि अगर आप दोनों 32 बिट और 64 बिट संस्करण को चलाने उसी मशीन पर आपके आवेदन के बाद वे प्रत्येक रजिस्ट्री कुंजियों के एक अलग सेट को देख रहे होंगे।

+2

एक त्वरित प्रश्न, यदि मैं एक COM घटक पंजीकृत करने के लिए regsvr32 का उपयोग कर रहा हूं, तो हम कैसे जानते थे कि हम x86 या x64 रजिस्ट्री के अंतर्गत पंजीकृत हैं या नहीं? मेरा ocnfusion है, यदि x86 रजिस्ट्री के तहत पंजीकृत है, तो x64 एप्लिकेशन COM घटक तक पहुंचने में सक्षम नहीं होगा? – George2

+7

64 बिट मशीन पर regsrv32 के दो संस्करण हैं। एक 64 बिट बाइनरी पंजीकृत करता है और एक Wow6432 नोड में 32 बिट बाइनरी पंजीकृत करता है। यह माइक्रोसॉफ्ट केबी आलेख आपके लिए सहायक हो सकता है: http://support.microsoft.com/kb/282747 –

+0

1. जब हम 32-बिट regsvr32 का उपयोग कर एक नया COM घटक पंजीकृत करते हैं, तो COM घटक x86 के लिए बनाया जाना चाहिए (जब हम 64-बिट regsvr32 का उपयोग कर एक नया COM घटक पंजीकृत करें, COM घटक x64 के लिए बनाया जाना चाहिए) - इसका मतलब है कि हम 64-बिट COM घटक पंजीकृत करने के लिए 32-बिट regsvr32 का उपयोग नहीं कर सकते हैं (या 64-बिट regsvr32 का उपयोग 32-बिट पंजीकृत करने के लिए COM घटक), सही? 2. 64-बिट प्रक्रिया COM CLSID के लिए केवल x64 रजिस्ट्री को प्राप्त कर सकती है, और 32-बिट प्रक्रिया केवल COM CLISD के लिए x86 रजिस्ट्री तक पहुंच सकती है, कोई क्रॉस एक्सेस नहीं। मेरी समझ सही है? – George2

1

मैं अपने डेस्कटॉप के रूप में एक x64 बिट मशीन को चलाने के; और मैंने कभी भी विभिन्न रजिस्ट्री कॉन्फ़िगरेशन के साथ किसी भी समस्या में भाग नहीं लिया है। http://msdn.microsoft.com/en-us/library/ms724072(VS.85).aspx

HTH

1

यहाँ WOW64 रजिस्ट्री पर विकिपीडिया लेख जो आप जानकारी के कुछ दे सकता है आप देख रहे हैं जाता है::

प्रति MSDN, वहाँ जाहिरा तौर पर एक अंतर है http://en.wikipedia.org/wiki/WOW64

+0

मान लीजिए कि मेरे पास किसी भी CPU के लिए बनाया गया .NET applicaiton है, और इसे x64 पर चलाएं, तो इसे रजिस्ट्री के x64 संस्करण तक पहुंचने के लिए JITed होना चाहिए - यानि x64 रजिस्ट्री के तहत पंजीकृत COM के CLSIDs, और यदि मैं 32- बिट COM घटक, .NET एप्लिकेशन इसे खोजने में सक्षम नहीं होगा? मेरी समझ सही है? – George2

6

आपकी समझ सही है। X86 सीएलएसआईडी तक पहुंचने के लिए x64 ऐप की आवश्यकता नहीं होगी क्योंकि यह उन घटकों को वैसे भी लोड नहीं कर सकता है और इसके विपरीत।

यदि आप x86 और x64 दोनों के उपयोग के लिए घटक बनाना चाहते हैं तो आपको या तो x86 के लिए बनाए गए डीएलएस की एक जोड़ी बनाना होगा और दूसरा x64 के लिए और रजिस्ट्री के उनके उचित हिस्सों में दोनों को पंजीकृत करना होगा। System32 फ़ोल्डर में regsrv32.exe x64 घटक को बदले में पंजीकृत करेगा और SysWOW64 फ़ोल्डर में regsrv32.exe x86 घटक पंजीकृत करेगा।

वैकल्पिक रूप से किसी भी CPU के लिए .NET असेंबली का निर्माण करें जो किसी भी CPU आर्किटेक्चर द्वारा उपयोग किया जा सकता है।

+0

@ एंथनीWJones, मुझे आपके द्वारा वर्णित किसी भी CPU नमूने में दिलचस्पी है। मान लीजिए मेरे पास किसी भी सीपीयू के लिए बनाया गया .Net applicaiton है, और इसे x64 पर चलाएं, तो इसे रजिस्ट्री के x64 संस्करण तक पहुंचने के लिए JITed होना चाहिए - यानी x64 रजिस्ट्री के तहत पंजीकृत COM के CLSIDs? मेरी समझ सही है? – George2

+1

उस परिदृश्य में यह जेआईटी या .NET नहीं है जो रजिस्ट्री का कौन सा हिस्सा सीएलएसआईडी को देखने के लिए तय करता है, यह तथ्य यह है कि जिस प्रक्रिया में कोड चल रहा है वह 64 बिट है जो निर्धारित करता है कि यह सीएलएसआईडी देखने के लिए किस सेट का उपयोग करेगा। यह ऐसा कुछ है जो स्वचालित रूप से विंडोज़ में स्थापित COM समर्थन पुस्तकालयों के अंदर होता है। – AnthonyWJones

+0

1. जब हम regsvr32 का उपयोग कर एक नया COM घटक पंजीकृत करते हैं, तो क्या हम इसे x86 रजिस्ट्री या x64 रजिस्ट्री के तहत या दोनों के तहत पंजीकृत करते हैं? 2. मेरी समझ है, 64-बिट प्रक्रिया केवल COM CLSID के लिए x64 रजिस्ट्री को प्राप्त कर सकती है, और 32-बिट प्रक्रिया केवल COM CLISD के लिए x86 रजिस्ट्री तक पहुंच सकती है, कोई क्रॉस एक्सेस नहीं। मेरी समझ सही है? – George2

4

वे अलग-अलग रजिस्ट्रियां नहीं हैं - एक दूसरे का सबनोड है, और ओएस यह सुनिश्चित करने के लिए वर्चुअलाइजेशन करता है कि 32 बिट ऐप्स को उनकी चाबियाँ मिलती हैं और 64 बिट ऐप्स को उनकी चाबियाँ मिलती हैं।

+0

इस विषय के शुरुआती के लिए कोई अनुशंसित रीडिंग? – George2

+1

ऊपर पोस्ट किया गया एमएसएनडी आलेख शायद शुरू करने के लिए सबसे अच्छी जगह है। http://msdn.microsoft.com/en-us/library/ms724072.aspx –

+0

एक त्वरित प्रश्न, यदि मैं एक COM घटक पंजीकृत करने के लिए regsvr32 का उपयोग कर रहा हूं, तो हम कैसे जानते थे कि हम x86 या x64 के तहत COM घटक पंजीकृत करते हैं या नहीं रजिस्ट्री? मेरा भ्रम है, अगर x86 रजिस्ट्री के तहत पंजीकृत है, तो x64 एप्लिकेशन COM घटक तक पहुंचने में सक्षम नहीं होगा? – George2

1

शुद्ध 64-बिट अनुप्रयोग में COM के रूप में उपयोग करने के लिए .NET असेंबली को कैसे पंजीकृत करें?

समस्या: डिफ़ॉल्ट रूप से, अगर आप सक्षम निर्माण सेटिंग्स में "COM Interop के लिए रजिस्टर", यह 64-बिट के लिए प्रकार लायब्रेरी पंजीकृत नहीं करता।

समाधान: अपने विधानसभा जो GAC में एक 64 बिट मशीन पर नहीं है, खुला cmd खिड़की रजिस्टर और ऐसा करने के लिए:

cd c:\windows\microsoft.net\framework64\v2.x.xxxxx 
regasm /codebase "path to your compiled assembly dll" 

यह खत्म करने होंगे "क्लास पंजीकृत नहीं त्रुटि" यदि स्थानीय का उपयोग कर COM ऑब्जेक्ट के रूप में .NET असेंबली को इंस्टाल करने के लिए C++।

+0

यह ठीक है जो मेरे 64 बिट मिश्रित मोड अनुप्रयोग को असफल होने का कारण बन रहा था - असेंबली विजुअल स्टूडियो 2010 द्वारा पंजीकृत 32 बिट कॉम थे। इसलिए COM इंटरऑप के लिए रजिस्टर की बजाय, मैंने उपरोक्त के रूप में विनियमन के लिए पोस्ट बिल्ड इवेंट डाले (साथ/टीएलबी मेरे मामले में पीढ़ी)। क्या इस व्यवहार से संबंधित एक एमएसडीएन लेख है? – DaBozUK

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