[VC++]Registry lesen
-
Hallo
Ich versuche einen wert aus der Registry auszulesen
der pfad ist:
HKEY_LOCAL_MACHINE\SOFTWARE\Activision\Call of Duty 4\QAder 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
-
wie sieht es damit aus?
-
ein blick in die FAQ hätte gelangt...
auf der zweiten seite läuft dir der artikel über den weg
Registrysollte 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öglichIch 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 hierHKEY 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//ByteDWORD 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.
-
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 umstellendann 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 zahldamit ihr mich besser verstehen könnt habe ich noch nen screen:
http://www.abload.de/image.php?img=hkeyhelp1afr.jpgmein 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.