const wchar_t * in const unsigned char * umwandeln
-
Hallo zusammen,
ich habe momentan das Problem, dass ich einen wstring habe und diesen an die WinAPI-Funktion RegSetValueExW() übergeben muss.
Dazu muss ich den wstring in ein const BYTE * umwandeln.Wenn ich jetzt den wstring mit c_str() in einen wchar_t * umwandle bringt mich das leider auch nicht weiter.
Hat jmd. von euch da eine Idee?
-
Celebrariel schrieb:
Wenn ich jetzt den wstring mit c_str() in einen wchar_t * umwandle bringt mich das leider auch nicht weiter.
Warum nicht?
-
Gegenfrage: Wie sollte es mir denn weiterhelfen?
-
Ich nehme doch an, dass in Deinem wstring die Daten stecken, die Du als Daten in die Registry schreiben willst.
Also musst Du einen Zeiger darauf als 5. Funktionsparameter mitgeben.
-
Hm ich glaube ich stehe hier gerade ziemlich auf dem Schlauch.
Hier mal den betreffenden Codeausschnitt:if (size == 0) { this->registry_id = this->random_string(TOKEN_LENGTH); this->first_startup = true; RegOpenKeyExW(REGISTRY_HKEY, REGISTRY_PATH, 0, KEY_ALL_ACCESS, &hKey); if (RegSetValueExW(hKey, REGISTRY_NAME, 0, REG_SZ, this->registry_id.c_str(), TOKEN_LENGTH) == ERROR_SUCCESS) { RegCloseKey(hKey); } else { RegCloseKey(hKey); } }
Jetzt soll ich einen Zeiger auf registry_id setzen? Wie soll das dann funktionieren?
-
Es ist schade, dass ich offensichtlich erraten soll, was Dein Problem ist, denn Du scheinst nicht bereit zu sein, es mir zu sagen ...
Aber okay, da Du noch relativ neu hier bist, versuche ich es mal:
Ich vermute mal, dass das hierregistry_id
Dein wstring ist. Dann ist
registry_id.c_str()
der Zeiger, den Du brauchst.
Dein Compiler sagt aber, dass er einen Zeiger auf einen const BYTE haben möchte. Also sag ihm, er soll deinen Zeiger als einen solchen betrachten:reinterpret_cast<const BYTE *>(registry_id.c_str())
Falls das Dein Problem nicht lösen sollte, wirst Du Dein Problem genauer schildern müssen, was ich Dir für die Zukunft bei weiteren Fragen oder Problemen generell ans Herz legen möchte.
Damit ist zum Beispiel eine Fehlermeldung des Compilers/Linkers gemeint, oder aber eine genaue Beschreibung dessen, was Dein Programm macht und dessen, was Du erwartest, dass es macht.
-
Wunderbar, hat funktioniert.
Entschuldige für die wenigen Informationen, nur komisch das ich mir einbilde, dass ich genau das was du mir jetzt gesagt hast vorhin schon ausprobiert habe. *grummel*Vielen Dank für die Hilfe.
-
Entschuldige für die wenigen Informationen, nur komisch das ich mir einbilde, dass ich genau das was du mir jetzt gesagt hast vorhin schon ausprobiert habe. *grummel*
Ich glaube ich verstehe dein Verständnisproblem.
Nehmen wir mal an, du hast ein Unicode Projekt und willst einen Unicode String in die Registry schreiben. Nun verlangt diese Funktion hierfür einen nullterminierten BYTE* Parameter.
Nun könnte man auf die schnelle zu folgenden fatalen Schluss kommen, dass man den Unicode String typsicher mittels WideCharToMultiByte() in einen Multibyte String umwandeln könnte und danach mit Hilfe des Multibyte String die Funktion RegSetValueEx() aufruft.
Das ist aber ein Trugschluss, denn RegSetValueExW() deutet ja schon darauf hin dass die Registry auch Unicode beherscht. In der Hilfe zu RegSetValueEx() finden wir einen Hinweis:
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.
Das heißt die Funktion RegSetValueExA() interpretiert den Parameter lpData als ASCII String, wandelt diesen in Unicode und schreibt diesen in die Registry. Bei RegSetValueExW() entfällt die Unicode Wandlung, lpData wird als Unicode String interpretiert und direkt in die Registry geschrieben. Mehr noch, bei dwType = REG_DWORD wird die Funktion in lpData vier Bytes eines DWORD Datentypes erwarten. Schön mächtig aber nicht typsicher.
Ähnlich verläuft es mit der Funktion SendMessage(). Dort hängt die Interpretation der Parameter wParam und lParam aber von dem Parametr Msg ab.