convert std::string to const BYTE* for RegSetValueEx()

后端 未结 4 984
深忆病人
深忆病人 2021-01-19 07:54

I have a function that gets a std::string. That function calls

RegSetValueEx

the 5th parameter is the value of the registry value and expects a variable of t

相关标签:
4条回答
  • 2021-01-19 08:14

    You could also copy the unicode string into a byte array:

    LPWSTR pData = L"SampleGrabber";
    int dwSize = wcslen(pData)*sizeof(TCHAR);
    BYTE slump[256];
    memset((void*) slump, 0, 256*sizeof(BYTE));
    memcpy((void*) slump, (const void *) pData, dwSize*sizeof(BYTE));
    
    globit = RegSetValueEx(hKey, NULL, 0, REG_SZ, (const BYTE*) slump, dwSize);
    

    If you had the misfortune to be writing code for a WINCE 5.0 device and it lacked part of the regedit API.

    0 讨论(0)
  • 2021-01-19 08:27
    void function(const std::string& newValue)
    {
        HKEY keyHandle;
        if(RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("some key"),0,KEY_ALL_ACCESS,&keyHandle) == ERROR_SUCCESS)
        {
    
            if (RegSetValueExA(keyHandle, "some value", NULL, REG_SZ, (const BYTE*)newValue.c_str(), newValue.size() + 1)==ERROR_SUCCESS)
            {
                    //do something
            }
            RegCloseKey(keyHandle);
        }
    }
    

    I removed the part where you convert your string to a wstring, instead you'll be using the ANSI version of RegSetValueEx explicitly.

    quote from RegSetValueEx remarks in MSDN:

    If dwType is the REG_SZ, REG_MULTI_SZ, or REG_EXPAND_SZ type and the ANSI version of this function is used (either by explicitly calling RegSetValueExA or by not defining UNICODE before including the Windows.h file), the data pointed to by the lpData parameter must be an ANSI character string. The string is converted to Unicode before it is stored in the registry.

    Also note that the cbData parameter should include the size of the null termination aswell.

    0 讨论(0)
  • 2021-01-19 08:28

    Shouldn't it be wNewValue.size()*2+2 ? The +2 for the null character? MSDN says: The size of the information pointed to by the lpData parameter, in bytes. If the data is of type REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ, cbData must include the size of the terminating null character or characters.

    0 讨论(0)
  • 2021-01-19 08:30

    The * 2 is because RegSetValueEx wants to know the number of bytes to write und each char (wchar_t) in a wstring is two bytes wide. So the resulting byte-array has twice the size!

    0 讨论(0)
提交回复
热议问题