RegSetValueEx仅显示写入第一个字符

时间:2014-02-25 21:20:07

标签: c++ winapi registry

在以下代码中,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)以及我能想到的任何其他大小,但似乎没有任何工作正常。有什么想法吗?

2 个答案:

答案 0 :(得分:7)

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

您的选择是:

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

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

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

答案 1 :(得分:2)

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

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