Konvertierungsprobleme

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Konvertierungsprobleme

    Weiß einer eine Lösung? Ich hab schon viele Typen durchprobiert, doch nichts funktionierte.
    Fragt mich nicht wie ich auf TCHAR gekommen bin. Ich las es sei besser dies zu verwenden, habe es also gelesen als ich ein anderes Problem hatte: Er las aus usw. doch am Ende kam nur Mist heraus. '._.
    Doch das ist auch nicht besser. Vielleicht kann ich zu dieser Uhrzeit auch schon nicht mehr klar denken. *grins*

    Quellcode

    1. #include <iostream>
    2. #include <Windows.h>
    3. #include <TCHAR.h>
    4. using namespace std;
    5. int main() {
    6. HKEY hKey;
    7. HKEY hKey2;
    8. TCHAR data[53];
    9. TCHAR Value[20];
    10. DWORD dwLenght;
    11. cout << "Key 1 wird geladen." << endl;
    12. RegOpenKeyEx(hKey, "Test", 0, KEY_ALL_ACCESS, &hKey);
    13. RegQueryValueEx(hKey, "Eintragsname", NULL, REG_SZ, (LPBYTE)data, &dwLenght);
    14. cout << "Key 2 wird geladen." << endl;
    15. RegOpenKeyEx(hKey2, "Software\\Microsoft\\Test2", 0, KEY_QUERY_VALUE, &hKey2);
    16. RegQueryValueEx(hKey2, "Eintragsname", NULL, REG_DWORD, (LPBYTE)Value, &dwLenght);
    17. RegCloseKey(hKey);
    18. RegCloseKey(hKey2);
    19. cout << "Der Inhalt des Schluessels 1 lautet: " << data << endl;
    20. cout << "Der Inhalt des Schluessels 2 lautet: " << atoi(Value) << endl;
    21. cout << "Ende." << endl;
    22. Sleep(5000);
    23. return(0);
    24. }
    Alles anzeigen


    MfG
    Check
  • TCHAR ist ein Prototyp, je nach Compilereinstellung, genau nach Präprozessor einstellung, wird dieser Typ entweder als char definiert oder als wchar_t.
    TCHAR sollte man in verbindung der Registry-Macro-Funktionen verwenden da diese auch nichts anderes sind wie Prototypen für ihre Multibyte-Versionen (=>char) und der Unicode-Version (=>wchar_t).

    Wenn du damit Arbeitest solltest du dewegen auch sicherstllen das konstanten mit dem Konventierungsmacro [__T(str)] versehen werden, damit diese richtig in Multibyte/Unicode konventiert werden und keine Probleme auf tauchen.

    Zu deinem Problem die Funktion (RegQueryValueEx), die du benutzt hollt Daten aus der Registry, der darfst du nicht expliziet sagen was für Typ als Eintrag du ausliesst. Das weiss die schon selbert. ;)

    ->

    Quellcode

    1. RegQueryValueEx(hKey,
    2. __T("Eintragsname"), // __T-Macro um Richtige Zeichensatzcodierugn festzulegen
    3. NULL,
    4. NULL, // NULL, oder Pointer auf eine DWORD Variable um den Datentyp zu erhalten
    5. (LPBYTE)data, // TCHAR in ein BYTE Pointer casten
    6. &dwLenght);


    Mfg Rushh0ur
  • Er meckert immer noch.

    ||=== RegistryTest2, Release ===|
    C:\Users\Matthis\Desktop\RegistryTest2\main.cpp||In function 'int main()':|
    C:\Users\Matthis\Desktop\RegistryTest2\main.cpp|11|error: invalid conversion from 'int' to 'DWORD*'|
    C:\Users\Matthis\Desktop\RegistryTest2\main.cpp|11|error: initializing argument 4 of 'LONG RegQueryValueExA(HKEY__*, const CHAR*, DWORD*, DWORD*, BYTE*, DWORD*)'|
    ||=== Build finished: 2 errors, 0 warnings ===|

    Kann es daran liegen, dass das ein String ist? Ja ich denk mal schon. :D

    MfG
    Check
  • Du willst also den Typ auch auslessen dann musst du auch die selben Variablentyp deklarieren, in diesem Fall nicht int sondern ein DWORD von welchem man die Addresse übergeben muss:

    Quellcode

    1. DWORD RegTyp;
    2. RegQueryValueEx(hKey,
    3. __T("Eintragsname"),
    4. NULL,
    5. &RegTyp, // argument 4, RegTyp vom Typ DWORD, durch dereferenzieren mittels & wird die Addresse übergeben (->DWORD*)
    6. (LPBYTE)data,
    7. &dwLenght);


    Mfg Rushh0ur
  • Ja ne sorry, bin irgentwie ausgegangen das es klar wäre.

    Hier ein komplettes Beispiel:

    Quellcode

    1. HKEY hKey;
    2. if (RegOpenKeyEx(HKEY_CURRENT_USER, __T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"), 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
    3. {
    4. DWORD dwType = 0;
    5. TCHAR data[256] = {0};
    6. DWORD dwDataLen = 256;
    7. if (RegQueryValueEx(hKey, __T("Desktop"), NULL, &dwType, (LPBYTE)data, &dwDataLen) == ERROR_SUCCESS)
    8. wcout << "Dektop = " << data << endl;
    9. else
    10. wcout << "Wert konnte nicht gefunden werden." << endl;
    11. RegCloseKey(hKey);
    12. }
    13. else
    14. wcout << "Registry konnte nicht geöffnet werden" << endl;
    Alles anzeigen



    Mfg Rushh0ur
  • Hmm... Ja, jetzt wo ich den so vergleiche. Man bin ich doof.
    Ich denke mal der Hauptfehler dabei war das "hKey" am Anfang, obwohl da HKEY_CURRENT_USER hingehörte.

    Bei der Zahl gibt er noch z aus. Ich werde mal sehen ob ich es lösen kann. Falls nicht werde ich den Code editieren und das Thema "pushen".

    MfG
    Check


    EDIT: Könnte es sein das er es im Hexadezimal anzeigt? '._.
    Im übrigen, wenn return(0); einsetzt meckert Windows mein kleines Programm würde nicht mehr funktionieren. Naja, vorerst ein Schönheitsfehler.
    EDIT 2: Das l und . wird als [¦ angezeigt. Lustigerweise die Zahl selbst auch. Interessant dabei ist, dass die 56667 nach regedit.exe 0x0000dd5b ist. Im hexadezimal ist [ 5b, jedoch ¦ A6. Vielleicht ist mein Ansatz auch falsch....

    Quellcode

    1. #include <iostream>
    2. #include <Windows.h>
    3. #include <TCHAR.h>
    4. using namespace std;
    5. int main() {
    6. HKEY hKey;
    7. HKEY hKey2;
    8. TCHAR data[53]={0};
    9. TCHAR Value[20]={0};
    10. wcout << "Key 1 wird geladen." << endl;
    11. if(RegOpenKeyEx(HKEY_CURRENT_USER, "Test", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
    12. {
    13. wcout << "Wert von Key 1 wird geladen." << endl;
    14. DWORD dwTyp=0;
    15. DWORD dwLenght=256;
    16. if(RegQueryValueEx(hKey, _T("Eintragsname"), NULL, &dwTyp, (LPBYTE)data, &dwLenght) == ERROR_SUCCESS)
    17. {
    18. wcout << "Test 1: String lautet: " << data << endl;
    19. }
    20. else
    21. {
    22. wcout << "Fehler! ID: 102" << endl;
    23. }
    24. RegCloseKey(hKey);
    25. }
    26. else
    27. {
    28. wcout << "Fehler! ID: 101" << endl;
    29. }
    30. wcout << "Key 2 wird geladen." << endl;
    31. if(RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Test2", 0, KEY_QUERY_VALUE, &hKey2) == ERROR_SUCCESS)
    32. {
    33. wcout << "Wert von Key 2 wird geladen." << endl;
    34. DWORD dwTyp=0;
    35. DWORD dwLenght=256;
    36. if(RegQueryValueEx(hKey2, _T("Eintragsname"), NULL, &dwTyp, (LPBYTE)Value, &dwLenght) == ERROR_SUCCESS)
    37. {
    38. wcout << "Test 1: Zahl lautet: " << Value << endl;
    39. }
    40. else
    41. {
    42. wcout << "Fehler! ID: 103" << endl;
    43. }
    44. RegCloseKey(hKey2);
    45. }
    46. wcout << "Test 2: Der Inhalt des Schluessels 1 lautet: " << data << endl;
    47. wcout << "Test 2: Der Inhalt des Schluessels 2 lautet: " << Value << endl;
    48. wcout << "Ende." << endl;
    49. Sleep(10000);
    50. return(0);
    51. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Checkmateing ()

  • Du musst halt auch auf den Variablentyp achten, der gibt dir nicht immer nen String zurück, deswegen gibt es auch einen Rückgabewert Typ, nur wenn das ein String ist kansnt du die Daten auch in ein Array schrieben und als String ausgeben lassen.

    In deinem Fall wird die gespeicherte Zahl wohl vom Typ DWORD sein. Dann musst du diese auch auch so behandeln. Die Größe eines DWORD ist 4Byte.

    Quellcode

    1. DWORD Value = 0;
    2. DWORD dwLenght=4;
    3. if(RegQueryValueEx(hKey2, _T("Eintragsname"), NULL, &dwTyp, (LPBYTE)&Value, &dwLenght) == ERROR_SUCCESS)
    4. {
    5. if (dwType == REG_DWORD)
    6. wcout << "Test 1: Zahl lautet: " << Value << endl;
    7. }


    Eine Liste der Typen finest du ebenfalls in der MSDN:
    msdn.microsoft.com/en-us/library/ms724884%28v=VS.85%29.aspx

    Mfg Rushh0ur
  • Das dachte ich mir auch, doch trotz allem werden die letzten 2 Zeichen vom String als [¦ ausgegeben und die Zahl auch. Die If-Bedingung ist eingefügt worden.
    Im Grunde wird hierbei "Value" ja auch nicht als DWORD behandelt, lediglich wird überprüft ob dwType REG_DWORD ist, woraufhin man dann Value ausgibt, immer noch als String.
    Von welchem Typ wäre denn Value? Immer noch TCHAR? Dann müsse man Value doch in DWORD umwandeln, dann würde es klappen oder? :huh:
    Ach man, warum habe ich immer nur spekulative Gedanken die im Endeffekt dann nur Teil-Richtig sind? :thumbdown:

    MfG
    Check

    EDIT: Gelöst. Einfach von Anfang an gleich als DWORD deklarieren.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Checkmateing ()