Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

31.10.2006, 16:16

Programmpfad aus registry lesen

Hy

Ich möchte aus der Registry den Pfad zu einer exe Datei auslesen.
Natürlich habe ich hier schon gesucht, google bedient und im MSDN nachgeschaut, nur es will grad auf dem letzten Meter der Groschen nicht so recht fallen :/

Mein Code:

C-/C++-Quelltext

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
#include <windows.h>
#include <stdio.h>
#include <iostream>

using namespace std;

int main()
{
    wchar_t temp[MAX_PATH]; 
    unsigned long size = sizeof(temp);
    HKEY hKey;
    
    if (RegOpenKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Blizzard Entertainment\\World of Warcraft", &hKey)==ERROR_SUCCESS) {
        printf("wunderbar");}
    else printf("ging net");

    RegQueryValueEx(hKey, L"GamePath", NULL, NULL, temp, &size);
    //if (RegQueryValue(hKey, L"GamePath", temp, &size)==ERROR_SUCCESS) {cout << "geklappt"; }

    RegCloseKey(hKey);
    cout << "\n";
    cout << size;
    cout << "\n";
    cout << temp;
    
    return 0;
}


Das erste Stück, den eigentlichen Registrybaum öffnen und an hkey zu übergeb klappt schonmal. Nun möchte ich dort den Wert "GamePath" auslesen um an die exe Datei zu kommen.
Nun hagelt es hier Fehler oder nach vielem rumfrickeln zwar keinen Fehler, aber es funktioniert nicht. Es hapert da wo ich den Wert des Keys in temp rein haben will.

Warscheinlich ist es was total dummes, nur ich peils grad irgendwie nicht.

Genaugenommen brauch ich am Ende einen String, Char whatever indem bei mir im konkreten Fall der Wert: "D:\Spiele\World of Warcraft\WoW.exe" stehen soll.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

31.10.2006, 16:43

Was gibt die Funktion zurück? War sie erfolgreich oder gibt es einen Fehlercode?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Anonymous

unregistriert

3

31.10.2006, 16:51

If the function succeeds, the return value is ERROR_SUCCESS.

If the function fails, the return value is a nonzero error code defined in Winerror.h. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.


:roll:

4

31.10.2006, 16:56

Also das RegOpenKey funktionert definitiv. Beim RegQueryValue gibt es den Fehler:

error C2664: 'RegQueryValueExW': Konvertierung des Parameters 5 von 'wchar_t [260]' in 'LPBYTE' nicht möglich

Es ist irgendwas mit Datentyp, nur ich komme irgendwie nicht drauf.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

31.10.2006, 17:10

@unsigned long: -.- du Held, ich meinte was sie bei ihm zurück gibt. Die Möglichkeiten kann ich auch selbst in der msdn nachlesen...

@RettetDemDativ:
RegQueryValueEx(hKey, L"GamePath", NULL, NULL, (LPBYTE)temp, &size);
und wenn in dem Buffer so seltsame Zeichnen stehen, versuch es mal mit char temp[MAX_PATH]; statt wchar_t temp[MAX_PATH];
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

6

31.10.2006, 17:25

@Nox

Okay, es läßt sich nun schonmal kompilieren.
Verständnisfragen hier: (LPBYTE) ist eine Typumwandlung? Wegen dem char temp anstelle dem wchar_t sollte ich wohl nochmal ein Unicode Kapitel lesen zum Verständnis :)

Nun ist meien Ausgabe aber:

72
D


Habe nun eine Schleife eingefügt:

C-/C++-Quelltext

1
for (int i=0; i<=size; i++) cout << temp[i];


Anscheinend stehen im Chararray munter Leerzeichen drin, nach jedem Zeichen. Hat der nun automatisch nach jedem Zeichen ein \n gemacht? Das würde die Länge von 72 ungefähr erklären

7

31.10.2006, 18:05

1. Den Pfad zur exe holt man sich anders
2. LPBYTE ist das selbe wie unsigned char* ...
3. Ne Schleife die man hochzählt ... unsigned int ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

31.10.2006, 18:06

Ne du solltest wchar_t schon nutzen. Das mit dem char war ja nur Idee Falls die Zeichen etwas seltsame aussehen und nur in diesem Fall sonst nicht :)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

9

31.10.2006, 18:18

Na komm dann schreib ich dir mal wie man den Pfad deiner Anwendung rausfindet:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
TCHAR szPath[MAX_PATH];   
LPTSTR lpszFileName = NULL;
  
if (GetModuleFileName(NULL, szPath, MAX_PATH) == 0 ||
    GetFullPathName(szPath, sizeof (szPath), szPath, &lpszFileName) == 0)
    return;

szPath[lpszFileName - szPath] = '\0';


Referenzen
GetModuleFileName
GetFullPathName
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige