You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Friday, July 1st 2011, 1:25am

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*

C/C++ Quellcode

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


MfG
Check

2

Friday, July 1st 2011, 9:50am

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. ;)

->

C/C++ Quellcode

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


Mfg Rushh0ur

3

Friday, July 1st 2011, 11:47am

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

4

Friday, July 1st 2011, 6:41pm

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:

C/C++ Quellcode

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


Mfg Rushh0ur

5

Friday, July 1st 2011, 7:07pm

Fehler in dem Sinne gibt es nicht mehr, aber den String gibt er gar nicht heraus und bei dem DWORD-Wert ist immer 0 da. hab per regedit vorsichtshalber nachgeschaut, das was ausgegeben werden sollte wäre 56667. 8|
Wenn du da auch noch die Lösung zu weißt, wirst du mich wohl als "Schüler" haben. :P

MfG
Check

6

Saturday, July 2nd 2011, 2:35am

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

Hier ein komplettes Beispiel:

C/C++ Quellcode

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



Mfg Rushh0ur

7

Saturday, July 2nd 2011, 1:11pm

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....

C/C++ Quellcode

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

This post has been edited 3 times, last edit by "Checkmateing" (Jul 2nd 2011, 1:40pm)


8

Saturday, July 2nd 2011, 1:36pm

*push* ^^

9

Saturday, July 2nd 2011, 4:00pm

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.

C/C++ Quellcode

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


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

Mfg Rushh0ur

10

Saturday, July 2nd 2011, 5:16pm

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.

This post has been edited 1 times, last edit by "Checkmateing" (Jul 2nd 2011, 5:55pm)


Social bookmarks