/ / Gibt es ein Problem bei der Verwendung von Backslashes in Registrierungsschlüsselnamen? - Windows, Qt, Registrierung, Backslash

Gibt es ein Problem mit Backslashes in Registrierungsschlüsselnamen? - Windows, Qt, Registrierung, Backslash

Ich schreibe ein kleines Programm mit QT Creator unter Windows 7 (32 Bit). Mein Ziel ist es, einen Windows-Schlüssel zu erstellen.

Ich benutze

QSettings settings("HKEY_CURRENT_USER\Software\Company", QSettings::NativeFormat);
settings.setValue("C:\path\prog.exe", "Value");

In der Windows-Registrierung hat der generierte Schlüssel jedoch den Wert C: /path/prog.exe Ich habe versucht, es mit zu konvertieren

qDebug() << QDir::toNativeSeparators("C:\path\prog.exe");

Die Ausgabe von qDebug () ist richtig c: pathprog.exe aber tun

settings.setValue(QDir::toNativeSeparators("C:\path\prog.exe"), "Value");

führt wieder zu einem Pfad mit einem falschen Schrägstrich. gibt es eine Möglichkeit, den Pfad in der Windows-Registrierung korrekt zu schreiben, ohne die Windows-API zu verwenden?

Vielen Dank Francesco

Antworten:

1 für die Antwort № 1

Sie können dies auch mit WinAPI nicht tun. Weil Sie einen ungültigen Schlüssel angeben. Sie sollten das verstehen QSettings Da die Klasse ein plattformspezifisches Backend verwendet, ist es nützlich, die Dokumentation zu lesen, wenn etwas nicht wie erwartet funktioniert. Fang hier an.

QSettings Klasse führt eine benutzerdefinierte Umwandlung in Schlüssel und durchWerte, so können Sie dort beliebige QVariant-Werte speichern. Sogar Arrays. Ungültige Werte für jede Plattform werden geschützt. Sie können genaue Transformationsregeln in Qt-Quellen betrachten.

Hinweis: Die Umwandlung der Werte hängt vom Typ der Einstellungsspeicher ab. Zum Beispiel ^ für .ini-Dateien.


-1 für die Antwort № 2

ok, ich habe es geschafft, mein Ziel zu erreichen

    RegSetValueEx(hkey, TEXT("C:\path\prog.exe"), 0, REG_SZ, (LPBYTE)TEXT("WIN98"), 6 * sizeof(WCHAR));

für eine konstante Zeichenfolge.

Wenn der Programmpfad in einem Zeichen * gespeichert ist (wie in meinem Fall), funktioniert es mit

char* exe_name = /*something*/
wchar_t* wString=new wchar_t[4096];
MultiByteToWideChar(CP_ACP, 0, exe_name, -1, wString, 4096);
RegCreateKeyEx( .......... )
RegSetValueEx(hkey, (LPCWSTR) wString, 0, REG_SZ, (LPBYTE)TEXT("WIN98"), 6 * sizeof(WCHAR));

Francesco