Wert eines Schlüssels in der REG auslesen



  • Hallo zusammen,

    ich möchte die REG nach einem bestimmten Wert eines Schlüssels auslesen.
    Schreiben, anlegen... ok, das krieg ich hin, aber hier hab ich ein Problem...

    Folgendes habe ich:

    #include <windows.h>
    #include <windowsx.h>
    
    HKEY hkey;
    
    int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpszCmdLine, int nCmdShow)
    {
    	CreateProcess(L"\\My Flash Disk\\Navigation\\mnavdce.exe\0",NULL,0,0,FALSE,0, 0, 0, NULL, NULL);		// Navigation starten
    	Sleep(5000);																						// Sleep von 5 Sekunden
    
    	RegOpenKeyEx(HKEY_CURRENT_USER, L"GoPal\\BtStatus\\", 0, KEY_READ, &hkey);					// Öffne REG-Eintrag
    	if (RegQueryValueEx ( hkey, L"1", NULL, NULL , NULL , NULL ) == ERROR_SUCCESS) 					// Prüfe auf Schlüssel
    		{
    		CreateProcess(L"\\My Flash Disk\\Bluetooth\\PhoneLink.exe\0",NULL,0,0,FALSE,0, 0, 0, NULL, NULL);	// BT starten
    		}
    	RegCloseKey(hkey);
    return 0;
    }
    

    Obwohl ich weiss, dass der Eintrag entweder 0 oder 1 ist. Nur wenn Bluetooth aktiv geschaltet ist, steht eine 1 dort. Warum startet er dann BT nicht???
    Was mach ich da falsch??? 😕

    Vielen Dank schon mal für eure Antworten! 🙂


  • Mod

    Ist BtStatus nun ein Wert oder ein weiterer Teilbaum?

    Heißt der Wert den Du lesen willst wirklich "1"?
    Warum liest DUnicht die Daten in ein Feld? Sonst weißt Du doch gar nciht was drin steht.



  • Hallo Martin, vielen Dank für die schnelle Rekation! 👍

    BtStatus hat den Wert 0 oder 1.

    Ich muss ja nur reagieren, wenn der BtStatus den Wert 1 hat. Hat er den Wert 0 interesiert mich das nciht und ich übergehe den Start der BT-Software.



  • Ach ich glaube, ich weiss wo der Fehler liegt... 🙄

    BtStatus ist natürlich kein Ordner, sondern der Schlüssel, der den Wert 0 oder 1 hat...
    Wer lesen kann ist extrem im Vorteil...

    Ausserdem habe ich gerade den REG-Auszug von dem Gerät bekommen. Entgegen seiner Aussage wird der Schlüssel auch nicht BtStatus sondern BTStatus geschrieben. Hat das Auswirkungen? In der Lua aus der ich das BtStatus habe ist es jedenfalls so geschrieben.

    Da muss ich also noch mal dran...



  • so hab ich das jetzt... kann es zwar kompilieren, aber nicht testen.

    #include <windows.h>
    #include <windowsx.h>
    
    HKEY hkey;
    
    int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpszCmdLine, int nCmdShow)
    {
    	CreateProcess(L"\\My Flash Disk\\Navigation\\mnavdce.exe\0",NULL,0,0,FALSE,0, 0, 0, NULL, NULL);		// Navigation starten
    	Sleep(5000);																						// Sleep von 5 Sekunden
    
    	DWORD dwNumber = 0;
    	DWORD dwData = sizeof(DWORD);
    	RegOpenKeyEx(HKEY_CURRENT_USER, L"GoPal\\", 0, KEY_READ, &hkey);					// Öffne REG-Eintrag
    	RegQueryValueEx(hkey,L"BTStatus",0,0,(BYTE*)&dwNumber,&dwData);		
    	if (dwNumber == 1);
    		{
    		CreateProcess(L"\\My Flash Disk\\Bluetooth\\PhoneLink.exe\0",NULL,0,0,FALSE,0, 0, 0, NULL, NULL);	// BT starten
    		}
    	RegCloseKey(hkey);
    return 0;
    }
    

    Der Teil der REG sieht so aus:

    [HKEY_LOCAL_MACHINE\GoPal]
    "BTStatus"="1"
    

    Ist das dann richtig so???


  • Mod

    Pitter (c) schrieb:

    Der Teil der REG sieht so aus:

    [HKEY_LOCAL_MACHINE\GoPal]
    "BTStatus"="1"
    

    Ist das dann richtig so???

    Nein!
    1. Wie Du selber siehst ist die Information in HKEY_LOCAL_MACHINE gespeichert.
    2. Du hast keinerlei Fhelerprüfung in Deinem Code für den Open!
    3. Eine Backslash am Ende eines Pfades würde ich immer weglassen.
    4. BTStatus ist als String gespeichert nicht als DWORD!



  • Argh... stimmt Martin. Das war ein ganz blöder Fehler mit HKCU. Muss natürlich HKLM sein.... 🙄

    Wenn ich mir das Beispiel aus den APIFaq ansehe:

    DWORD dwData = 256;
    BYTE cDaten[256] = "";
    RegQueryValueEx(hKey,"EintragsName",0,0,cDaten,&dwData2);
    

    und das auf meine "Bedüfnisse" umstricke, dann müsste das dann bei mir so aussehen:

    DWORD dwData = 256;
    BYTE cDaten[256] = "";
    RegQueryValueEx(hKey, L"BTStatus",0,0,cDaten,&dwData);
    

    cDaten müsste dann eigentlich meine 0 oder 1 enthalten, oder sehe ich das falsch? Der letzte Parameter ist ja die Grösse des Buffers.

    Was ich jetzt nicht verstehe ist, wie ich diesen Wert dann auslesen soll.



  • Den Wert auslesen? Also der Wert ist in 'cDaten' enthalten, somit kannst du mit 'cDaten' normal arbeiten ..

    Als Beispiel:

    if (cDaten == "1")
        MessageBox (NULL, "Der Wert ist 1 !", "Registry-Ergebnis:", MB_OK);
    

    EDIT:

    Mich würde mal interessieren, was bei dir in hKey enthalten ist 🙂



  • Hallo,

    hmmm... das dachte ich eigentlich auch, aber...
    Ich hab den code jetzt folgendermassen:

    #include <windows.h>
    #include <windowsx.h>
    
    HKEY hkey;
    
    int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpszCmdLine, int nCmdShow)
    {
    	CreateProcess(L"\\My Flash Disk\\Navigation\\mnavdce.exe\0",NULL,0,0,FALSE,0, 0, 0, NULL, NULL);		// Navigation starten
    	Sleep(5000);																						// Sleep von 5 Sekunden
    
    	DWORD dwData = 256;
    	BYTE cDaten[256] = "";
    	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"GoPal", 0, KEY_READ, &hkey)== ERROR_SUCCESS);							// Öffne REG-Eintrag
    		{
    		if (RegQueryValueEx(hkey, L"BTStatus",0,0,cDaten,&dwData)==ERROR_SUCCESS);
    			if (cDaten == "1");
    				{
    				CreateProcess(L"\\My Flash Disk\\Bluetooth\\PhoneLink.exe\0",NULL,0,0,FALSE,0, 0, 0, NULL, NULL);	// BT starten
    				}
    		}
    		RegCloseKey(hkey);
    return 0;
    }
    

    allerdings bekomme ich beim erstellen der Exe den Fehler:
    Operands of == have incompatible types 'unsigned char *' and 'char *' in der Zeile 17, also bei if (cDaten == "1")... 😕



  • Fehler gefunden und beseitigt:

    if (cDaten[0] == '1')
    

    ...und schon klappt das... 🙂


Anmelden zum Antworten