Windows注册表问题

包斯

我正在尝试使用D修改注册表中的某些值,但它一直给我以下错误:

无法设定值

但是,如果我用C#编写完全相同的代码,那么它将起作用。是D中的注册表模块有问题还是我的使用方式有问题?

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

当您有SOFTWARE\WOW6432Node注册表项时,您的系统是64位的。默认情况下,C#编译器(请参见/ platform:anycpu,在VS中也默认使用)生成一个程序集,该程序集在64位系统上以64位进程运行,在32位系统上以32位进程运行。

同样,默认情况下,默认情况下,将64位系统上32位进程的注册表查询重定向到特殊WOW6432Node子项(例如,打开请求HKLM\Software实际上会打开HKLM\Software\WOW6432Node,请参见MSND文章“注册表中的32位和64位应用程序数据”)。结果,您的32位D应用程序(就像您的C#应用​​程序以32位进程运行时一样)实际上尝试打开SOFTWARE\Wow6432Node\Wow6432Node\EA GAMES\The Sims 2不存在的密钥。

要解决此问题,请在64位模式下(-m64开关)编译D应用程序,或使用它REGSAM.KEY_WOW64_64KEY来禁用默认重定向:

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

注意:如果RegistryView.Registry64在64位系统上作为32位进程运行,则可以用于禁用C#中的默认重定向。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

导入刚从regedit导出的Windows注册表的问题

来自分类Dev

PrototypeJS事件注册表问题

来自分类Dev

RMI:注册表安全问题

来自分类Dev

远程注册表查询问题

来自分类Dev

我的 onClick 注册表有问题

来自分类Dev

从Perl中的Windows注册表读取

来自分类Dev

Windows注册表运行键

来自分类Dev

使用Perl解析Windows注册表

来自分类Dev

Windows注册表HKCR合并规则

来自分类Dev

访问Windows注册表Python

来自分类Dev

Linux等效于Windows注册表

来自分类Dev

Windows 7注册表设置文档

来自分类Dev

如何永久更改Windows注册表?

来自分类Dev

Windows注册表中的神秘@字符

来自分类Dev

Windows 10刷新并影响注册表

来自分类Dev

Windows注册表| 如何打开.lnk

来自分类Dev

从Ubuntu访问Windows注册表

来自分类Dev

在Windows中从Bootdocker登录到Docker Hub注册表时出现问题

来自分类Dev

Windows中的64位和32位注册表问题(在C#中编程)

来自分类Dev

在Windows注册表中注册应用程序

来自分类Dev

Windows用户的到期日期或注册表在注册表中的何处?

来自分类Dev

如何还原和转储Windows注册表而不覆盖当前注册表

来自分类Dev

Docker推动私有注册表问题

来自分类Dev

Docker不下载图像(注册表连接问题)

来自分类Dev

使用cpp向注册表添加值的问题

来自分类Dev

使用架构注册表时遇到问题:下载

来自分类Dev

通过Windows注册表更改Windows中的声音方案

来自分类Dev

Haskell:将DWORD值导入Windows注册表

来自分类Dev

通过Windows注册表安装Chrome扩展程序