Windows registry error

I try to change some values โ€‹โ€‹in the registry using D, but it keeps giving me the following error:

Value cannot be set

However, if I write the exact code in C #, then it works. Is this a problem with the registry module in D or is it a problem with how I use it?

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

WITH#

 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", "HM 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(); } } } 
+6
source share
1 answer

Since you have a SOFTWARE\WOW6432Node registry SOFTWARE\WOW6432Node , your system is 64-bit. By default, the C # compiler (see / platform: anycpu , it is also used by default in VS) creates an assembly that runs as a 64-bit process on a 64-bit system and a 32-bit process on a 32-bit system.

Also, by default, 32-bit process registry queries on a 64-bit system are redirected to a special WOW6432Node subkey (for example, a request to open HKLM\Software will actually open HKLM\Software\WOW6432Node , see the MSND article "32-bit and 64-bit application data in the registry " ). As a result, your 32-bit D-application (like your C # application, if it runs as a 32-bit process) is actually trying to open the SOFTWARE\Wow6432Node\Wow6432Node\EA GAMES\The Sims 2 key that does not exist.

To fix the problem, either compile the D application in 64-bit mode ( -m64 switch), or use REGSAM.KEY_WOW64_64KEY to disable the default redirection:

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

Note: RegistryView.Registry64 can be used to disable the default redirection in C # if it works as a 32-bit process on a 64-bit system.

+1
source

Source: https://habr.com/ru/post/986771/


All Articles