2015-05-07 7 views
6

मैं रजिस्ट्री डी का उपयोग करने में कुछ मान को संशोधित करने के कोशिश कर रहा हूँ, लेकिन यह मुझे निम्न त्रुटि दे रही रखता है:Windows रजिस्ट्री मुद्दा

Value cannot be set

लेकिन अगर मैं सी # में ठीक उसी कोड लिखने तो यह काम करता है। क्या यह डी में रजिस्ट्री मॉड्यूल के साथ कोई समस्या है या क्या मैं इसका उपयोग कर रहा हूं?

डी

module main; 

import std.windows.registry; 
import std.stdio; 

import core.thread; 

void main() { 
    string languageName = "English"; 
    string languageCode = "en_uk"; 
    const uint languageValue = 0x00000001; 
    writefln("Name '%s' Code '%s' Value '%s'", languageName, languageCode, languageValue); 
    writeln("Press ENTER to change language."); 
    readln(); 
    writefln("Changing language of Sims 2 to '%s' ...", languageName); 
    Thread.sleep(dur!("msecs")(2000)); 
    string keyName; 
    try { 
     enum versions = [ 
      "", 
      "Apartment Life", 
      "Bon Voyage", 
      "Celebration Stuff", 
      "Family Fun Stuff", 
      "Free Time", 
      "Fun with Pets Collection", 
      "Glamour Life Stuff", 
      "H M Fashion Stuff", 
      "IKEA Home Stuff", 
      "Kitchen & Bath Interior Design Stuff", 
      "Mansion and Garden Stuff", 
      "Nightlife", 
      "Open For Business", 
      "Pets", 
      "Seasons", 
      "Teen Style Stuff", 
      "University" 
     ]; 
     foreach (simsVersion; versions) { 
      keyName = "SOFTWARE\\Wow6432Node\\EA GAMES\\The Sims 2"; 
      if (simsVersion && simsVersion.length) 
       keyName ~= " " ~ simsVersion; 
      // main 
      { 
       scope auto key = Registry.localMachine.getKey(keyName); 
       key.setValue("Language", languageName); 
       key.setValue("Locale", languageCode); 
       key.flush(); 
      } 
      // sub 
      { 
       keyName ~= "\\1.0"; 
       scope auto key = Registry.localMachine.getKey(keyName); 
       key.setValue("Language", languageValue); 
       key.setValue("LanguageName", languageName); 
       key.flush(); 
      } 
      writefln("Changed language of '%s' ...", simsVersion); 
     } 
     writeln("Success..."); 
     Thread.sleep(dur!("msecs")(2000)); 
    } 
    catch (Throwable t) { 
     writefln("Key Entry: '%s'", keyName); 
     writeln(t); 
     readln(); 
    } 
} 

सी #

class Program 
{ 
    public static void Main(string[] args) 
    { 
     const string languageName = "English"; 
     const string languageCode = "en_uk"; 
     const uint languageValue = 0x00000001; 
     string[] versions = new string[] 
     { 
      "", 
      "Apartment Life", 
      "Bon Voyage", 
      "Celebration Stuff", 
      "Family Fun Stuff", 
      "FreeTime", 
      "Fun with Pets Collection", 
      "Glamour Life Stuff", 
      "H M Fashion Stuff", 
      "IKEA Home Stuff", 
      "Kitchen & Bath Interior Design Stuff", 
      "Mansion and Garden Stuff", 
      "Nightlife", 
      "Open For Business", 
      "Pets", 
      "Seasons", 
      "Teen Style Stuff", 
      "University" 
     }; 
     const string mainKey = @"SOFTWARE\Wow6432Node\EA GAMES\The Sims 2"; 
     string keyName = ""; 
     try 
     { 
      Console.WriteLine("Name '{0}' Code '{1}' Value '{2}'", languageName, languageCode, languageValue); 
      Console.WriteLine("Press ENTER to change language."); 
      Console.ReadLine(); 
      Console.WriteLine("Changing language of Sims 2 to '{0}' ...", languageName); 
      Thread.Sleep(2000); 

      foreach (var simsVersion in versions) 
      { 
       if (!string.IsNullOrWhiteSpace(simsVersion)) 
        keyName = mainKey + " " + simsVersion; 
       else 
        keyName = mainKey; 
       // main 
       { 
        var key = Registry.LocalMachine.OpenSubKey(keyName, true); 
        key.SetValue("Language", languageName); 
        key.SetValue("Locale", languageCode); 
        key.Close(); 
       } 
       // sub 
       { 
        keyName += "\\1.0"; 
        var key = Registry.LocalMachine.OpenSubKey(keyName, true); 
        key.SetValue("Language", languageValue); 
        key.SetValue("LanguageName", languageName); 
        key.Close(); 
       } 
       Console.WriteLine("Changed language of '{0}' ...", simsVersion); 
      } 
      Console.WriteLine("Success..."); 
      Thread.Sleep(2000); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Key: '{0}'", keyName); 
      Console.WriteLine(e); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

अपने डी कोड 64-बिट के रूप में संकलित है? –

+0

इसके अलावा, आप एक व्यवस्थापक के रूप कार्यक्रम चल रहे हैं? –

+0

मैं 32 बिट के साथ संकलन कर रहा हूं और व्यवस्थापक के रूप में चल रहा हूं। – Bauss

उत्तर

1

आप SOFTWARE\WOW6432Node रजिस्ट्री प्रविष्टि के रूप में आपके सिस्टम 64-बिट है। डिफ़ॉल्ट सी # संकलक द्वारा (/platform:anycpu देखते हैं, यह भी वी.एस. में डिफ़ॉल्ट रूप से प्रयोग किया जाता है) एक विधानसभा जो 64-बिट सिस्टम पर 64-बिट प्रक्रिया के रूप में और 32-बिट सिस्टम पर 32-बिट प्रक्रिया के रूप में चलाता है पैदा करता है।

64-बिट सिस्टम पर एक 32-बिट प्रक्रिया के डिफ़ॉल्ट रजिस्ट्री प्रश्नों द्वारा

इसके अलावा विशेष WOW6432Node उपकुंजी के लिए पुनः निर्देशित कर रहे हैं (उदा अनुरोध HKLM\Software वास्तव में खुलेगा HKLM\Software\WOW6432Node को खोलने के लिए, MSND article "32-bit and 64-bit Application Data in the Registry" देखें)। नतीजतन अपने 32-बिट डी आवेदन (यदि 32-बिट प्रक्रिया के रूप में चलाने की तरह ही अपने सी # आवेदन करना होगा) वास्तव में SOFTWARE\Wow6432Node\Wow6432Node\EA GAMES\The Sims 2 कुंजी जो मौजूद नहीं है खोलने के लिए कोशिश करता है।

इस मुद्दे को ठीक या तो 64-बिट मोड में डी आवेदन (-m64 स्विच) संकलन या डिफ़ॉल्ट पुनर्निर्देशन निष्क्रिय करने के लिए REGSAM.KEY_WOW64_64KEY का उपयोग करें:

Registry.localMachine.getKey(keyName, REGSAM.KEY_READ | REGSAM.KEY_WOW64_64KEY); 

नोट: RegistryView.Registry64 सी # में डिफ़ॉल्ट पुनर्निर्देशन निष्क्रिय करने के लिए इस्तेमाल किया जा सकता है अगर यह 64-बिट सिस्टम पर 32-बिट प्रक्रिया के रूप में चलता है।

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