2010-12-19 3 views
2

Ich bin Casting (char *) auf Daten und ich bekomme nur einen char-Wert in der Registrierung. Wenn Ich benutze nicht das Casting msvc 2010 sagt mir, dass der Argumenttyp LPCTSTR ist nicht kompatibel mit const char *.C++ RegSetValueEx legt nur einen char-Wert in der Registrierung

kann mir jemand helfen?

HKEY hKey; 
LPCTSTR sk = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); 

LONG openRes = RegOpenKeyEx(HKEY_CURRENT_USER, sk, 0, KEY_ALL_ACCESS , &hKey); 

if (openRes==ERROR_SUCCESS) { 
    printf("Success opening key."); 
} else { 
    printf("Error opening key."); 
} 

LPCTSTR value = TEXT("SomeKey"); 
LPCTSTR data = L"TestData\0"; 

LONG setRes = RegSetValueEx (hKey, value, 0, REG_SZ, (LPBYTE)data, strlen(data)+1); 

if (setRes == ERROR_SUCCESS) { 
    printf("Success writing to Registry."); 
} else { 
    printf("Error writing to Registry."); 
} 
cout << setRes << endl; 

LONG closeOut = RegCloseKey(hKey); 
if (closeOut == ERROR_SUCCESS) { 
    printf("Success closing key."); 
} else { 
    printf("Error closing key."); 
} 
+0

Tom, es dritte Frage ist in Die letzten paar Stunden bezogen sich auf die inkonsistente Verwendung von schmalen und breiten Zeichenfolgen. Anstatt jedes Mal, wenn ein Problem auftritt, auf SO zu schreiben, ist es vielleicht besser, den gesamten Code zu überprüfen, um diese Inkonsistenzen zu beseitigen. Vielleicht kann dieser Artikel helfen: http://msdn.microsoft.com/en-us/library/ff381407%28v=vs.85%29.aspx? – atzz

Antwort

7

strlen(data) gibt wahrscheinlich einen Wert von 1 zurück, da Strlen erwartet ein char * und L"TestData\0" ist breit. Verwenden Sie TEXT("TestData\0") und rufen Sie _tcslen(data).
Beachten Sie, dass RegSetValueEx die erwartet sizeof die Daten, so _tcslen(data) * sizeof(TCHAR)

+0

Sieht aus wie eine bessere Erklärung/Vorschlag als meine :) – zenzelezz

+0

wenn ich versuche, dies zu verwenden, zum Beispiel LPCTSTR Daten = TEXT ("ThisIsTheValueIWant \ 0"); dann werde ich nur in der Registry "ThisIsTheV" was soll ich tun? – Tom

+0

Antwort geändert, um dies zu berücksichtigen. –

1

Wo werden Daten übertragen?

Wie auch immer, es sieht so aus, als ob Sie mit breiten Zeichen arbeiten, aber Sie scheinen "plain old" strlen zu verwenden - anstelle von wcslen oder einer anderen Funktion, die mit breiten Zeichenfolgen arbeiten soll.

0

ersetzen die L"TestData" von _T("TestData"); und strlen(data)+1 von tcslen(data) * sizeof(TCHAR));

verwenden, so sieht der Code wie folgt:

LPCTSTR value = TEXT("SomeKey"); 
LPCTSTR data = TEXT("TestData"); 

LONG setRes = RegSetValueEx(hKey, value, 0, REG_SZ, (LPBYTE)data, _tcslen(data) * sizeof(TCHAR));