2015-09-04 104 views
-2

我试图在C++中向注册表添加宽字符字符串。问题是RegSetValueEx()函数不支持宽字符,它只支持​​类型(​​= unsigned char)。在C++中将注册表值设置为宽字符字符串(WCHAR)

WCHAR myPath[] = "C:\\éâäà\\éâäà.exe" 
RegSetValueExA(HKEY_CURRENT_USER, "MyProgram", 0, REG_SZ, myPath, sizeof(myPath)); // error: cannot convert argument 5 from WCHAR* to BYTE* 

请不要告诉我,我应该WCHAR转换为​​因为字符如éâ不能被储存为8个字符。

我敢肯定,这是可能的,因为我试图打开regedit并添加一个值为C:\\éâäà\\éâäà.exe的新密钥,它的工作。我想知道其他程序如何在俄文或中文计算机上添加到启动程序。

有没有另外一种方法呢?或者有没有办法使用通配符来格式化宽字符路径?

编辑:函数RegSetValueExW()的Unicode版本仅更改第二个参数的类型。至少谷歌功能downvoting之前!

+0

使用'RegSetValueExW'。 A后缀表示窄字符版本; W代表宽字符。 –

回答

2

如果您应该致电RegSetValueExW(),请致电RegSetValueExA()。但无论如何,RegSetValueEx()写入字节,而不是字符,这就是为什么lpData参数被声明为BYTE*。只需输入你的角色数组。 dwType参数中的REG_SZ值将让RegSetValueEx()知道该字节表示Unicode字符串。并确保包括在您传递到cbData参数的值空终结,每documentation

CBSIZE [中]
的信息的大小指向以字节为单位的lpData参数,。如果数据类型为REG_SZ,REG_EXPAND_SZ或REG_MULTI_SZ,则cbData必须包含终止空字符或字符的大小

例如:

WCHAR myPath[] = L"C:\\éâäà\\éâäà.exe"; 
RegSetValueExW(HKEY_CURRENT_USER, L"MyProgram", 0, REG_SZ, (LPBYTE)myPath, sizeof(myPath)); 

或者:

LPCWSTR myPath = L"C:\\éâäà\\éâäà.exe"; 
RegSetValueExW(HKEY_CURRENT_USER, L"MyProgram", 0, REG_SZ, (LPCBYTE)myPath, (lstrlenW(myPath) + 1) * sizeof(WCHAR)); 

话虽这么说,你不应该写值的HKEY_CURRENT_USER本身的根源。你应该写信给一个子密钥,例如:

WCHAR myPath[] = L"C:\\éâäà\\éâäà.exe"; 

if (RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\\MyProgram", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == 0) 
{ 
    RegSetValueExW(hKey, L"MyValue", 0, REG_SZ, (LPBYTE)myPath, sizeof(myPath)); 
    RegCloseKey(hKey); 
} 
0

在我看来,你试图使用该功能的窄/非宽字符版本,它只支持ASCII。如何尝试RegSetValueExW?也许你还应该查看Windows API如何尽可能透明地支持ASCII和UNICODE。