RegSetValueExW: std::wstring in const BYTE*



  • Hi,

    bevor ich jetzt ganz blöd werde:
    Wie kann ich std::wstring in const BYTE* umwandeln ?

    Hintergrund der Geschichte:
    Ich will per RegCreateKeyEx und RegSetValueEx einen Reg-Key ändern (Typ REG_SZ) und kriege es aber nicht hin, in die Typ zu konvertieren.

    HKEY hLastCfgKey = NULL;
    DWORD dwErg = 0;
    if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\MyApp\\lastCfg", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, 
    		NULL, &hLastCfgKey, &dwErg) == ERROR_SUCCESS)
    {
        RegSetValueEx(hLastCfgKey, L"LastCfg", 0, REG_SZ, reinterpret_cast<LPBYTE>(&strCfgDir), strCfgDir.length());
        RegCloseKey(hLastCfgKey);
    }
    else
    {
        ...
    }
    

    Bei dieser Variante steht aber eben nix im Reg-Key.

    Kann mir jemand helfen ?
    Schonmal Danke dafür !



  • Das Beispiel hilft dir vielleicht weiter.

    .
    .
    wchar_t *dllName = L"C:\\WINDOWS\\SYSTEM32\\eventSource.dll";
    .
    .
    RegSetValueEx(hk,				// subkey handle 
    	L"EventMessageFile",		// value name 
    	0,							// must be zero 
    	REG_EXPAND_SZ,				// value type 
    	(LPBYTE) dllName,			// pointer to value data 
    	(DWORD) (lstrlen(dllName)+1)*sizeof(TCHAR))) // data size
    

  • Mod

    Du solltest .c_str verwenden bevor Du den cast machst.

    @oneill5000 :
    Wenn Du schon die Unicode Version benutzt mit

    RegSetValueEx(hk,                // subkey handle 
        L"EventMessageFile",
    

    dann bitt keinen TCHAR hier:

    (DWORD) (lstrlen(dllName)+1)*sizeof(TCHAR))) // data size
    


  • Achso ok. Naja ich hab es jetzt nur aus dem Beispiel kopiert, dachte aber eigentlich wenn man in unicode kompiliert, TCHAR als wchar_t definiert ist. Oder zählt das nur für _TCHAR?
    Kann gerade leider selber nichts testen.
    Unter dem Beispiel steht als Änderung für eine unicode Version nur:

    The example does not work if you have a unicode project (default in VS2005).

    To get a correct unicode version you have to:
    Insert _T(x) macro for all string literals
    Replace "printf" with "_tprintf"

    For better usage you also should replace "LPTSTR" with "LPCTSTR" in the function parameters



  • Ok, habe mit der Rumcasterei noch so meine Probleme, aber ich versuche sowieso nur da zu casten, wo es auch notwendig ist.
    Es war auch schon schlimmer bei mir. 🙂

    Ok, so funzt es ja:

    const wchar_t *test = strCfgDir.c_str();
    RegSetValueEx(hLastCfgKey, L"LastCfg", 0, REG_SZ, reinterpret_cast<LPBYTE>(&test), strCfgDir.length());
    

    Problem hatte ich eher mit der Meldung ...'&'requires l-Value.
    Habe mir das jetzt mal ergoogelt und jetzt nun mal den Sinn verstanden.
    Hatte das vorher nicht wirklich kapiert. 🙂

    Ja, wenn mit Unicode compiliert wird, dann ist TCHAR = wchar_t, bei MBCS ist es char.
    Aber so der Kenner der ganzen typedefs bin ich noch nicht.

    Ich danke euch vielmals für die Hilfe ! 👍



  • Nein, hat doch nicht geklappt !
    Im Reg-Key stehen nur kryptische Zeichen.

    Aber liegt das denn an dem Cast ?
    Die Verwendung ist die im vorigen Post.


  • Mod

    const wchar_t *test = strCfgDir.c_str();
    RegSetValueEx(hLastCfgKey, L"LastCfg", 0, REG_SZ, reinterpret_cast<LPBYTE>(&test), strCfgDir.length());
    

    Test ist doch schon ein Zeiger. Was willst Du mit einem Zeiger auf einen Zeiger?



  • Ok, du hast natürlich mal wieder recht. 🙂

    HKEY hLastCfgKey = NULL;
    if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\PROVISIO\\SiteKiosk", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hLastCfgKey, &dwErg) == ERROR_SUCCESS)
    {
        if (RegSetValueEx(hLastCfgKey, L"LastCfg", 0, REG_SZ, reinterpret_cast<const BYTE*>(strCfgDir.c_str()), strCfgDir.size()*sizeof(wchar_t)) == ERROR_SUCCESS)
            wcout << "Wert des LastCfg-Keys wurde erfolgreich gesetzt !" << endl << endl;
        else
            GenerateErrorMessage(L"LastCfg-Key setzen");
        RegCloseKey(hLastCfgKey);
    }
    

    So passt es.

    Zum letzten Parameter von RegSetValueEx: Habe in einem Forum ein Beitrag entdeckt, den ich probiert habe und es funktioniert auch nur damit:

    So it would be better to write wNewValue.size()*sizeof(wchar_t) to make it clear what's going on.

    Versteh das grad nicht ganz, kann mir das erklären ?



  • RegSetValueEx möchte die Länge in Bytes haben, nicht die Anzahl der wchar_t's. Und zwar inklusive des "null-terminators", also inklusive des abschliessenden Null-Zeichens. Steht aber auch alles in der MSDN:

    MSDN schrieb:

    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.

    Also:

    RegSetValueExW(hLastCfgKey, L"LastCfg", 0, REG_SZ, reinterpret_cast<const BYTE*>(strCfgDir.c_str()), (strCfgDir.size() + 1) * sizeof(wchar_t));
    


  • Ok, bin heut sowieso nicht wirklich aufnahmefähig, hab das in der MSDN total überlesen.

    Ich danke dir für die Aufklärung ! 👍

    Noch nen schönen Abend !!


Log in to reply