无法在 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));

编辑:大小还应包括终止空字符