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
-
Du solltest .c_str verwenden bevor Du den cast machst.
@oneill5000 :
Wenn Du schon die Unicode Version benutzt mitRegSetValueEx(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.
-
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 !!