2012-03-09 11 views
8

गायब हो रहा है मैं कुछ पुराने एमएफसी कोड में कॉल करने के लिए COM का उपयोग करने वाली हमारी पुरानी विधि को बदलने के लिए .net4 में TimeZoneInfo.GetSystemTimeZones का उपयोग करने का प्रयास कर रहा हूं। हालांकि, मुझे COM विधि पर वापस जाना पड़ा क्योंकि GetSystemTimeZones सभी समय क्षेत्रों को वापस नहीं करता है। यूके में आधारित होने और विकल्पों की हमारी सूची में जीएमटी मानक समय सहित एक समस्या नहीं है।GetSystemTimeZones जीएमटी मानक समय

जब मैं रजिस्ट्री में लग रहे हैं, मुझे लगता है कि जीएमटी मानक समय परिभाषित कोई नियम नहीं के साथ एक गतिशील डीएसटी उपकुंजी है। मैंने .NET4 स्रोत कोड डाउनलोड किया है और, TimeZoneInfo.cs में, GetSystemTimeZones अंततः TryCreateAdjustmentRules को कॉल करता है जो डायनामिक डीएसटी कुंजी में कोई फर्स्ट एंटर्री या LastEntry परिभाषित नहीं है, तो झूठी वापसी दिखाई देता है।

  // 
      // loop over all of the "<time_zone_name>\Dynamic DST" hive entries 
      // 
      // read FirstEntry {MinValue  - (year1, 12, 31)} 
      // read MiddleEntry {(yearN, 1, 1) - (yearN, 12, 31)} 
      // read LastEntry {(yearN, 1, 1) - MaxValue  } 

      // read the FirstEntry and LastEntry key values (ex: "1980", "2038") 
      Int32 first = (Int32)dynamicKey.GetValue(c_firstEntryValue, -1, RegistryValueOptions.None); 
      Int32 last = (Int32)dynamicKey.GetValue(c_lastEntryValue, -1, RegistryValueOptions.None); 

      if (first == -1 || last == -1 || first > last) { 
       rules = null; 
       return false; 
      } 

TryCreateAdjustmentRules झूठे रिटर्न के रूप में, TryGetTimeZoneByRegistryKey एक InvalidTimeZoneException जो जीएमटी मानक समय समय क्षेत्र संग्रह में से नहीं जोड़ा गया है इसका मतलब है फेंकता है। मैंने खाली डायनामिक डीएसटी उपकुंजी को हटाने का प्रयास किया है, लेकिन कुछ उन्हें फिर से जोड़ता है (शायद विंडोज अपडेट)।

मैंने बहुत सी खोज की है लेकिन किसी और ने इस समस्या की रिपोर्ट नहीं की है। मुझे यकीन नहीं है कि GetSystemTimeZones ठीक है या नहीं, मैं खाली स्थान डायनामिक डीएसटी उपकुंजी को पहले स्थान पर दिखाना बंद कर सकता हूं या नहीं। कोई विचार?

+0

यह बेहद अजीब बात है - "जीएमटी मानक समय" निश्चित रूप से मेरे लिए वापस आ गया है। क्या आप यह निर्धारित करने के लिए उपयोग कर रहे कोड को पोस्ट कर सकते हैं कि यह गुम है? यह शायद ठीक है, लेकिन जैसा कि हम अजीब परिणाम देख रहे हैं ... –

+0

मुझे यह कहने से नफरत है लेकिन यह मेरे सिस्टम पर काम करता है, मैं ब्रिटेन में हूं और मुझे लौटाए गए 101 मूल्यों में 'जीएमटी मानक समय' दिखाई देता है। क्या आपने इसे किसी अन्य सिस्टम पर आजमाया है? – Lazarus

+0

जॉन, क्या आपकी जीएमटी मानक समय रजिस्ट्री कुंजी में एक खाली गतिशील डीएसटी उपकुंजी है? –

उत्तर

1

यह पता चला है कि समस्या हमारे COM ऑब्जेक्ट के साथ है और .NET कोड के साथ नहीं है। रजिस्ट्री को पढ़ने के लिए कोड केवल पढ़ना चाहिए, लेकिन यह गलत रजिस्ट्री शाखा में एकाधिक कॉल को अनुकूलित करने के लिए गलती से RegCreateKey को कॉल करता है।

जब एक नया संस्करण की वजह से COM ऑब्जेक्ट पंजीकृत है (व्यवस्थापक अधिकारों के साथ), यह समय क्षेत्र लोड करता है और स्थानीय समय क्षेत्र के लिए डायनामिक डीएसटी बनाता है जो मेरे मामले में जीएमटी/यूटीसी है।

व्यवस्थापक, मुझे लगता है कि इस प्रश्न को हटाने के लिए चिह्नित किया जाना चाहिए।

+0

आह हे! तो यह COM ऑब्जेक्ट था! : डी – dyslexicanaboko

1

मुझे लगता है कि यह सिर्फ एक रजिस्ट्री समस्या है।

WinXP/Server 2003 SP1 के लिए यहां कुछ समान रूप से उल्लिखित है। कृपया देखें कि निम्नलिखित में मदद करता है: http://blogs.technet.com/b/dst2007/archive/2007/03/06/missing-time-zones-in-registry.aspx

मेरा अनुमान है कि आप किसी अन्य मशीन से पूरे रजिस्ट्री कुंजी निर्यात कर सकता है, और अपने समस्याग्रस्त बॉक्स (ते) पर लागू है।

+0

मेरी समस्या यह है कि मैं रजिस्ट्री संपादक में इसे हटाकर _Dynamic DST_ उपकुंजी से छुटकारा पा सकता हूं और रजिस्ट्री ठीक दिखती है। कुछ बाद के बिंदु पर कुंजी फिर से दिखाई देती है लेकिन यह कई दिनों बाद हो सकती है। मुझे नहीं पता कि यह फिर से दिखने का क्या कारण बनता है। मैं परीक्षण सर्वर पर रेगमन का उपयोग करके यह देखने के लिए कोशिश करूंगा कि क्या कोई संकेत देता है या नहीं। –

0

अपनी समस्या को देखने के बाद और समय क्षेत्र की एक सूची मुद्रित करने के लिए टिप्पणियों में प्रदान किए गए कोड को चलाने के बाद भी मैं अपने सिस्टम पर जीएमटी दिखाने के लिए सक्षम नहीं हूं। मैं विंडोज 7 प्रोफेशनल चला रहा हूं और जीएमटी का चयन सिर्फ एक विकल्प नहीं है। मुझे पता है कि आपकी समस्या का समाधान नहीं होता है और आप - कई अन्य लोगों की तरह - ध्वनि की तरह आपको वास्तव में जीएमटी के साथ काम करने की आवश्यकता होती है।

हालांकि सभी संभव पर अगर, अगर आप यूटीसी उपयोग करने के लिए एक तरह से देखते हैं तो मैं बाहर की जाँच करेगा इन कड़ियों:

Windows 7 Lack of Support for GMT

Converting UTC to GMT

आपकी समस्या का बस एक और संभावित जवाब है, वहाँ है वैसे भी आप जीएमटी प्रदर्शित करने के लिए यूटीसी मूल्यों के चारों ओर एक रैपर बना सकते हैं? मैं पूछता हूं क्योंकि यह समस्या ऐसा प्रतीत नहीं होती है कि यह जल्द ही कभी दूर जा रहा है। भले ही आप इसे अभी काम पर लाएं - भविष्य में यह फिर से टूट सकता है। अगर मैं इसके लिए एक विधि के साथ आता हूं तो मैं अपना जवाब अपडेट करूंगा।

+0

आपके उत्तर के लिए धन्यवाद लेकिन मुझे स्पष्टीकरण दें। रजिस्ट्री में कुंजी _GMT मानक टाइम_ (यूके समय क्षेत्र) है लेकिन समय क्षेत्र की सूची में प्रदर्शन टेक्स्ट _ (यूटीसी) डबलिन, एडिनबर्ग, लिस्बन, लंदन_ है। यूटीसी और जीएमटी एक ही चीज़ के लिए दो नाम हैं, विंडोज 2003 जीएमटी प्रदर्शित करता है जबकि 2008 यूटीसी प्रदर्शित करता है। –

+1

यह एक लंबा शॉट है, लेकिन क्या आपने यह देखने के लिए अपने COM ऑब्जेक्ट को अनधिकृत करने का प्रयास किया है कि क्या यह कुंजी को बैक अप दिखाने से रोकता है? – dyslexicanaboko

+0

मुझे अन्य कार्यक्षमता के लिए मेरी COM ऑब्जेक्ट की आवश्यकता है। जहां तक ​​मुझे पता है कि यह केवल इस रजिस्ट्री शाखा से पढ़ता है। अब मुझे रजिस्ट्री को देखकर प्रोसेस मॉनीटर मिल गया है जो इसे पुन: प्रयास करने के लिए लॉग इन करने का प्रयास करता है। –

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