[VC++]Registry lesen



  • Hallo

    Ich versuche einen wert aus der Registry auszulesen
    der pfad ist:
    HKEY_LOCAL_MACHINE\SOFTWARE\Activision\Call of Duty 4\QA

    der wert besteht nur aus zahlen
    Ich habe fleißig gegoogelt und sehr viele sources gefunden, allerdings funzte keiner richtig jetzt habe ich hier einen source gefunden, mit dem man order in der
    Registry erstellen kann:

    #include <iostream>
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    #include <shellapi.h>
    #include <stdlib.h>
    #include <fstream>
    #include <tchar.h>
    #include <cstdio>
    #include <winuser.h>
    #pragma comment(lib, "Advapi32")
    int main(){

    HKEY hKey;
    // Registry-Key erstellen
    RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\Test"), 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &hKey, 0);

    RegCloseKey(hKey);
    }

    der code funzt, allerdings will ich ja nur einen wert auslesen und keinen order erstellen, es wäre wirklich toll wenn ihr mir einen kompletten(also mit declarationen usw)source zeigenen könntet 🙂

    danke mfg Raptox





  • ein blick in die FAQ hätte gelangt...
    auf der zweiten seite läuft dir der artikel über den weg
    Registry

    sollte all deine fragen beantworten



  • Danke erstmal ich bin schon ein ganze stück weiter 🙂

    ich habe jetzt:

    int main(){

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

    beim debuggen bekomme ich folgenden fehler:
    1>projects\cod4dev\cod4dev\dev.cpp(19) : error C2664: 'RegQueryValueExW': Konvertierung des Parameters 2 von 'const char [13]' in 'LPCWSTR' nicht möglich

    Ich weis überhaupt nicht wie ich damit jetzt umgehen soll ich bin mir ziemlich sicher das int dwData2 falsch ist(hab ich selbst declariert, da es in der FAQ nicht deklariert war)

    danke mfg Raptox



  • Dein Projekt verwendet Unicode, um den Fehler zu beheben, mußt Du das Makro _T beim 2 Parameter verwenden.

    RegQueryValueEx(hKey,_T("EintragsName"),0,0,cDaten,&dwData2);
    

    Turmfalke64



  • hab jz:

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

    Error:

    Die nicht initialisierte lokale Variable "hKey" wurde verwendet.

    trotzdem danke



  • da stimmt so einiges nicht...

    1. dein HOTKEY (hKey) ist null somit kann es schonmal nicht funzen
    den must du durch RegOpenKey(Ex) mit einen der folgenden werte belegen
    HKEY_CLASSES_ROOT
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS
    HKEY_CURRENT_CONFIG
    noch mehr davon gibts hier

    HKEY hKey;
    char szSupKey[MAX_PATH] = _T("SOFTWARE\Microsoft\Windows\CurrentVersion\Setup");
    RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSupKey, NULL, KEY_ALL_ACCESS, &hKey);
    

    dann ist der 4 Parameter von RegQueryValueEx auch null, der muss aber den schlüßeltyp angeben.

    REG_NONE//unbekannt
    REG_SZ//String
    REG_EXPAND_SZ//String
    REG_MULTI_SZ//String
    REG_LINK//ka
    REG_DWORD//Dword
    REG_DWORD_BIG_ENDIAN//Dword
    REG_BINARY//Byte

    DWORD dwType=REG_DWORD;
    BYTE Data[1024]={0};
    DWORD dwDataSize=sizeof(Data);
    char szValueName[64] = _T("CDInstall");//Name des Schlüßel der den Wert enthält
    
    RegQueryValueEx(hKey, szValueName, 0, &dwType, (BYTE*) &dwReturnValue, &dwDataSize);
    

    je nachdem welchen wert du aus der registry abfragen willst must du den Schlüßeltyp und den rückgabetyp (hier dwReturnValue) anpassen.

    der code ist zwar aus dem bauch raus geschrieben,
    wenn du den aber so übernimmst sollte dir dwReturnValue eine 1 zurückgeben, sofern du ein CD laufwerk hast.


  • Mod

    char szSupKey[MAX_PATH] = _T("SOFTWARE\Microsoft\Windows\CurrentVersion\Setup"); 
    RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSupKey, NULL, KEY_ALL_ACCESS, &hKey);
    

    KEY_ALL_ACCESS? Muss das wirklich sein. So etwas läuft auf keinem Vista und Windows 7 System, wenn die Applikation nicht als Admin gestartet wird.
    Zum Auslesen sollte man nur die Rechte anfordern, die man auch braucht.



  • stimmt hast schon recht,
    da er das aber ja nur braucht um seinen hack zu schreiben, und er mit 100%'tiger
    sicherheit admin auf seinem rechner ist, hab ich mir darüber keine gedanken gemacht. das soll er tun, fals er mal in die verlegenheit kommt ein programm zu schreiben das benutzerdefinierte rechte braucht 😉



  • Also danke erstmal euch beiden. Ich konnte die fehler jz ein ganzes stück ein dämmen mein letztes prob:

    int main()
    {
    HKEY hKey;
    RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("Software\\Adobe\\Photoshop\\9.0"),0,KEY_ALL_ACCESS,&hKey);
    CHAR inhalt[256] = "";
    DWORD dwData = sizeof(inhalt);
    RegQueryValueEx(hKey,_T("ApplicationPath"),NULL,NULL,(LPBYTE)inhalt,&dwData);
    RegCloseKey (hKey);
    }

    Error:

    (13) : error C3861: "_T": Bezeichner wurde nicht gefunden.
    (16) : error C3861: "_T": Bezeichner wurde nicht gefunden.

    mfg



  • hast du die tchar.h noch includiert??

    fals du noch mit unicode arbeitest kannst du auch L vor einen string setzten

    RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"Software\\Adobe\\Photoshop\\9.0",0,KEY_ALL_ACCESS,&hKey);

    oder stell dein project um auf Multi-Byte-Zeichensatz

    - rechtsklick auf dein Project
    - im Popupmenu Eigenschaften auswählen
    - im Dialogfeld [Projectname]-Eigenschaftsseiten links in der Baumansicht
    - Konfigurationseigenschaften/Allgemein anklicken
    - rechts in der Listanansicht
    - Projectstandarts/Zeichensatz auf Multi-Byte-Zeichensatz verwenden umstellen

    dann kannst du ohne die Makros arbeiten

    RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\Adobe\\Photoshop\\9.0",0,KEY_ALL_ACCESS,&hKey);



  • tchar war nicht includiert 🙂
    es geht jetzt endlich ohne fehler an 🙂

    {
    	HKEY hKey;
    	RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("Software\\Activision\\Call of Duty 4\\"),0,KEY_ALL_ACCESS,&hKey);
    	CHAR inhalt[256] = "";
    	DWORD dwData = sizeof(inhalt);
    	RegQueryValueEx(hKey,_T("Version"),NULL,NULL,(LPBYTE)inhalt,&dwData);
    	cout<<inhalt<<endl;
    	RegCloseKey (hKey);
    	}
    

    und ab zum nächsten prob 🙂 :
    ich will den pfad :

    HKEY_LOCAL_MACHINE\SOFTWARE\Activision\Call of Duty 4*Version*
    das Version will ich auslesen, es besteht aus einer zahl

    damit ihr mich besser verstehen könnt habe ich noch nen screen:
    http://www.abload.de/image.php?img=hkeyhelp1afr.jpg

    mein programm gibt aber garkeinen text aus

    danke für eure hilfe mfg



  • Hallo,

    prüfe doch mal den Rückgabewert der Funktionen, vor allem bei RegOpenKeyEx. Du forderst mit KEY_ALL_ACCESS sehr viele Rechte ein, die du vielleicht nicht bekommst. Wie Martin Richter schon geschrieben hat, nur das nötigste Recht (KEY_QUERY_VALUE reicht hier völlig) nutzen.

    MfG,

    Probe-Nutzer



  • wenn er admin ist auf seinem rechner geht das ganz locker mit ALL_ACCESS

    sein fehler liegt in der Pfadangabe!!!

    Software\\Activision\\Call of Duty 4**\**

    mit dem letzten Backslash sagt er RegOpenKeyEx das hinter dem Ordner Call of Duty 4 noch ein ordner kommt. somit schlägt die Operation fehl. Weil die funktion nach einem unbekannten ordner sucht (nicht benannt o. nicht vorhanden) somit ist hKey NULL oder mit irgendeinem schrott belegt. womit RegQueryValueEx nix anfangen kann und folglich findet es unter dem Handle von hKey den wert Version nicht und übergibt an die ausgabeparameter nur NULL zurück.

    anbei sei vermerkt, würdest du rückgabewerte von RegOpenKeyEx bzw. RegQueryValueEx behandeln & auswerten, wärest du vieleicht selber drauf gekommen.

    Mann kan an dieser stelle nicht oft genug auf die MSDN verweisen.


Anmelden zum Antworten