【问题标题】:RegSetValueEx Only shows writes first characterRegSetValueEx 仅显示写入的第一个字符
【发布时间】:2014-03-28 09:36:04
【问题描述】:

在下面的代码中,RegSetValueEx 只写了我的字符串的第一个字母。我尝试将大小更改为我能想到的任何大小,但我只得到第一个字符串。任何帮助表示赞赏。

LPCWSTR path = L"Test String";
size_t size = wclsen(path) * sizeof(wchar_t);

DWORD dwResult = RegSetValueEx(HKEY_LOCAL_MACHINE,
                            "SOFTWARE\\My App",
                            0,
                            REG_SZ,
                            (LPBYTE)path,
                            test);

我尝试过使用 path.size() * sizeof(wchar_t) 和我能想到的任何其他尺寸,但似乎没有任何效果。有什么想法吗?

【问题讨论】:

  • @chris:啊,你是对的,我忘记了那个细节。我看到演员给我敲响了警钟,我可能有点太快了。
  • @AdamRosenfield,我在写演员表时也有同样的感觉 :)

标签: c++ winapi registry


【解决方案1】:

RegSetValueEx() 期望 REG_SZ 数据以const TCHAR* 的形式提供,在您的情况下,根据您的编译器设置是const CHAR* - 显而易见,您可以将char* 传递给第二个参数,这意味着您实际上是在调用RegSetValueExA()。由于您向RegSetValueExA() 提供const WCHAR*,因此第一个0x00 字节被解释为空终止符,因此只写入一个字符值。

您的选择是:

  1. RegSetValueExW(..., (const BYTE*) path, ...

  2. CString sPath(path); RegSetValueEx(..., (const BYTE*) (LPCTSTR) sPath, ...

  3. 将项目设置切换为 Unicode 构建

【讨论】:

    【解决方案2】:

    听起来你在编译之前还没有定义UNICODE/_UNICODE,所以你的宽字符串中的零字节被解释为表示字符串的结束。

    尝试改用RegSetValueExW(和L"SOFTWARE\\My App")。

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 2014-10-21
      • 2011-08-19
      • 2021-09-11
      • 2019-06-10
      • 1970-01-01
      相关资源
      最近更新 更多