2015-05-07 26 views
6

sto cercando di modificare alcuni valori nel Registro di sistema utilizzando D, ma continua a darmi il seguente errore:Registro di Windows Problema

Value cannot be set

Tuttavia se scrivo lo stesso codice esatto in C# allora funziona. È un problema con il modulo di registro in D o è un problema con il modo in cui lo sto usando?

D

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(); 
    } 
} 

C#

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

Il codice D è compilato a 64 bit? –

+0

Inoltre, stai eseguendo il programma come amministratore? –

+0

Sto compilando con 32 bit e in esecuzione come amministratore. – Bauss

risposta

1

Come avete SOFTWARE\WOW6432Node voce del Registro di sistema è a 64 bit. Per impostazione predefinita, il compilatore C# (vedere /platform:anycpu, viene anche utilizzato per impostazione predefinita in VS) produce un assembly che viene eseguito come processo a 64 bit sul sistema a 64 bit e come processo a 32 bit sul sistema a 32 bit.

Pure in query di registro predefinite di un processo a 32 bit sul sistema a 64 bit vengono reindirizzati a speciali WOW6432Node sottochiave (ad esempio richiesta per aprire HKLM\Software sarà effettivamente aperto HKLM\Software\WOW6432Node, vedi MSND article "32-bit and 64-bit Application Data in the Registry"). Di conseguenza, l'applicazione D a 32 bit (proprio come farà l'applicazione C# se eseguita come processo a 32 bit) tenta effettivamente di aprire la chiave SOFTWARE\Wow6432Node\Wow6432Node\EA GAMES\The Sims 2 che non esiste.

per risolvere il problema o compilare applicazioni D in modalità a 64 bit (-m64 interruttore) o utilizzare REGSAM.KEY_WOW64_64KEY per disattivare il reindirizzamento di default:

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

Nota: RegistryView.Registry64 può essere utilizzato per disattivare il reindirizzamento di default in C# se viene eseguito come processo a 32 bit sul sistema a 64 bit.

Problemi correlati