moin,
habe derzeit ein Problem mit "GetPrivateProfileString", bis jetzt habe ich den Pointer für ein Spiel immer mit
Code:
int pNetwork = 0x10731E08;
deklariert. Jetzt möchte ich aber, das der Pointer von einer ini Datei geladen wird. Bis jetzt ist das Spiel mit dem geladenen Pointer immer abgestürtzt...
Quote:
char buffer[10];
GetPrivateProfileStringA("Pointer","_pNetwork","0x 10731E08",buffer,10,"C:\settings.ini");
int BaseAddress = atoi(buffer);
Base = *(int*)(BaseAddress);
Deswegen wir dein Pointer 0 sein, was das Spiel wiederum zum Absturz bringt.
Abhilfe wuerde die dezimale Schreibweise schaffen oder du laesst das "0x" weg.
UINT Base = GetPrivateProfileInt("Pointer", "_pNetwork", 0, "C:\settings.ini");
Der Inhalt der "settings.ini" sollte dabei so aussehen:
Code:
[Pointer]
_pNetwork=0x10731E08
Du könntest es aber so machen wie damals und das Programm die Adressen suchen lassen.
Ich hab mir mal eine kleine .dll erstellt und es getestet. Das kam dabei raus (aktueller GER Stand):
Ok das Lesen geht jetzt ohne Probleme wenn ich einen festen Pfad angebe wie z.B. "C:\settings.ini", ich möchte die DLL aber injizieren, deshalb habe ich den Pfad auf "settings.ini" geändert. Jetzt wird aber die settings.ini überhaupt nichtmehr geladen, sie befindet sich im selben ordner wie die DLL und im selben wie die exe in die die DLL injiziert wird...
Wenn sie sich in selben Verzeichnis befindet sollte es reichen nur den Dateinamen an zu geben. "C:\settings.ini" wäre ein absoluter Pfad, "settings.ini", "..\settings.ini" oder "Data\settings.ini" wären relative Pfade, weil sie relativ vom Ausführunsverzeichnis ermittelt werden.
Ok, fopen findet die Datei... Das Problem war das die Exe von einem Launcher gestartet wurde, das Verzeichniss war also das Verzeichniss des Launchers. Die .ini wird aber trotzdem nicht geladen. Werde die Datei jetzt wohl manuell einlesen müssen.
Teste das Laden der Daten aus der .ini doch einmal einfach in der Konole und versuche dort den Fehler zu beheben. Warum das Rad neu erfinden und einen eigenen .ini Parser schreiben, wenn es nicht unbedingt nötig ist.
lpFileName [in]
The name of the initialization file. If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory.
ANSI und UNICODE zu vermischen ist keine gute Idee..
Außerdem kann das so schlecht funktionieren
GetModuleFileName -> C:\MeinOrdner\MeinProgramm.dll
sprintf -> C:\MeinOrdner\MeinProgramm.dll\settings.ini
Benutz dazwischen PathRemoveFileSpec, um "\MeinProgramm.dll" zu entfernen.
Ok das Lesen geht jetzt ohne Probleme wenn ich einen festen Pfad angebe wie z.B. "C:\settings.ini", ich möchte die DLL aber injizieren, deshalb habe ich den Pfad auf "settings.ini" geändert. Jetzt wird aber die settings.ini überhaupt nichtmehr geladen, sie befindet sich im selben ordner wie die DLL und im selben wie die exe in die die DLL injiziert wird...
Leider auch ohne Erfolg, der Pfad ist eintweder "D" oder "E" ^^
Sag mir wenn ich mich irre, aber habe ich die die Lösung nicht schon 12 Stunden vor diesem Beitrag per PN beantwortet? Ich habe dir sogar zwei verschiedene Lösungsvorschläge genannt.