无法在 RegSetValue 中设置 cbData
Can't set cbData in RegSetValue
我正在尝试创建类型为 REG_SZ 且值超过 4 个字符的注册表项。
但我想不出将数据作为参数传递的正确方法:
#include <windows.h>
#include <stdio.h>
HKEY OpenKey(HKEY hRootKey, wchar_t* strKey)
{
HKEY hKey;
LONG nError = RegOpenKeyEx(hRootKey, strKey, 0, KEY_ALL_ACCESS, &hKey);
if (nError == ERROR_FILE_NOT_FOUND)
{
printf("Debug: Creating registry key\n");
nError = RegCreateKeyEx(hRootKey, strKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL);
}
if (nError) {
printf("Error: Could not find or create\n");
}
return hKey;
}
void SetValSZ(HKEY hKey, LPCTSTR lpValue, LPCTSTR data)
{
LONG nError = RegSetValueEx(hKey, lpValue, 0, REG_SZ, (const BYTE*) data, sizeof(data));
if (nError)
printf("Error: Could not set registry value\n");
}
int main()
{
HKEY hKey = OpenKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\Policies\Microsoft\FVE");
const wchar_t data[] = L"AAAABBBBCCCC";
SetValSZ(hKey, L"RecoveryKeyMessage", data);
RegCloseKey(hKey);
return 0;
}
当我运行它时,只保存前4个字符。
我一定是打错了...
你有什么想法可以帮我解决吗?
谢谢。
PS:我希望我的英语很清楚,如果不是,请随时问我更多。
void SetValSZ(HKEY hKey, LPCTSTR lpValue, LPCTSTR data)
{
RegSetValueEx(hKey, lpValue, 0, REG_SZ, (const BYTE*) data, sizeof(data));
}
data
作为函数指针传递,因此其实际大小将丢失。 sizeof(data)
被转换为指针的大小,在本例中为 4 个字节。
您必须将尺寸作为参数传递:
int len = sizeof(data);
SetValSZ(..., data, len);
或者更好的是,使用 wcslen()
计算字符串长度,然后将其乘以 sizeof(wchar_t)
。
由于您正在使用那些 T
宏,函数可以写成:
RegSetValueEx(hKey,lpValue,0,REG_SZ,(const BYTE*)data,sizeof(TCHAR)*(lstrlen(data) + 1));
编辑:大小还应包括终止空字符
我正在尝试创建类型为 REG_SZ 且值超过 4 个字符的注册表项。
但我想不出将数据作为参数传递的正确方法:
#include <windows.h>
#include <stdio.h>
HKEY OpenKey(HKEY hRootKey, wchar_t* strKey)
{
HKEY hKey;
LONG nError = RegOpenKeyEx(hRootKey, strKey, 0, KEY_ALL_ACCESS, &hKey);
if (nError == ERROR_FILE_NOT_FOUND)
{
printf("Debug: Creating registry key\n");
nError = RegCreateKeyEx(hRootKey, strKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL);
}
if (nError) {
printf("Error: Could not find or create\n");
}
return hKey;
}
void SetValSZ(HKEY hKey, LPCTSTR lpValue, LPCTSTR data)
{
LONG nError = RegSetValueEx(hKey, lpValue, 0, REG_SZ, (const BYTE*) data, sizeof(data));
if (nError)
printf("Error: Could not set registry value\n");
}
int main()
{
HKEY hKey = OpenKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\Policies\Microsoft\FVE");
const wchar_t data[] = L"AAAABBBBCCCC";
SetValSZ(hKey, L"RecoveryKeyMessage", data);
RegCloseKey(hKey);
return 0;
}
当我运行它时,只保存前4个字符。 我一定是打错了...
你有什么想法可以帮我解决吗?
谢谢。
PS:我希望我的英语很清楚,如果不是,请随时问我更多。
void SetValSZ(HKEY hKey, LPCTSTR lpValue, LPCTSTR data) { RegSetValueEx(hKey, lpValue, 0, REG_SZ, (const BYTE*) data, sizeof(data)); }
data
作为函数指针传递,因此其实际大小将丢失。 sizeof(data)
被转换为指针的大小,在本例中为 4 个字节。
您必须将尺寸作为参数传递:
int len = sizeof(data);
SetValSZ(..., data, len);
或者更好的是,使用 wcslen()
计算字符串长度,然后将其乘以 sizeof(wchar_t)
。
由于您正在使用那些 T
宏,函数可以写成:
RegSetValueEx(hKey,lpValue,0,REG_SZ,(const BYTE*)data,sizeof(TCHAR)*(lstrlen(data) + 1));
编辑:大小还应包括终止空字符