Hi!
Ich hab vor 2 Tagen begonnen C++ zu lernen und wollte nun meine erste DLL für Game Maker machen. Mit der DLL soll man mehrere Dateien als eine Datei speichern können (so eine Art Archiv). Ich hab das ganze schon als Konsolenanwendung programmiert, wo man die einzelnen Dateien über die Tastatur eingibt und diese werden dann zum Archiv hinzugefügt. Die Funktionen zum extrahieren und löschen von einzelnen Dateien sind auch schon fertig und funktionieren.
Aber wenn ich das als DLL mach, sagt mir der GM immer bei der 4. Datei die ich hinzufüge "Unexpected error occured when running the game". Das komische ist, bei den ersten 3 Dateien funktioniert es immer, nur bei der 4. zeigt er diese Fehlermeldung an, egal welche Datei das ist.
ich hab folgende Scripts:
Init():
Add():
Alles anzeigen
Extract():
und Delete():
Und hier der C++ Code:
Alles anzeigen
(Tut mir leid für den langen Code)
Ich denke der Fehler ist in der C++ Datei, aber ich find ihn nicht
Bitte helft mir
Ich hab vor 2 Tagen begonnen C++ zu lernen und wollte nun meine erste DLL für Game Maker machen. Mit der DLL soll man mehrere Dateien als eine Datei speichern können (so eine Art Archiv). Ich hab das ganze schon als Konsolenanwendung programmiert, wo man die einzelnen Dateien über die Tastatur eingibt und diese werden dann zum Archiv hinzugefügt. Die Funktionen zum extrahieren und löschen von einzelnen Dateien sind auch schon fertig und funktionieren.
Aber wenn ich das als DLL mach, sagt mir der GM immer bei der 4. Datei die ich hinzufüge "Unexpected error occured when running the game". Das komische ist, bei den ersten 3 Dateien funktioniert es immer, nur bei der 4. zeigt er diese Fehlermeldung an, egal welche Datei das ist.
ich hab folgende Scripts:
Init():
GML-Quellcode
- global.XRes_add=external_define("XRes.dll","_GM_Add_File",dll_stdcall,ty_real,4,ty_string,ty_string,ty_string,ty_string);
- global.XRes_extract=external_define("XRes.dll","_GM_Extract_File",dll_stdcall,ty_real,4,ty_string,ty_string,ty_string,ty_string);
- global.XRes_delete=external_define("XRes.dll","_GM_Delete_File",dll_stdcall,ty_real,3,ty_string,ty_string,ty_string);
Add():
GML-Quellcode
- ret=external_call(global.XRes_add,argument0,argument1,argument2,argument3);
- switch(ret) {
- case 101: show_error("Fehler beim Öffnen der Datei!",true); break;
- case 102: show_error("Fehler beim Öffnen des Archivs!",true); break;
- case 103: show_error("Datei nicht gefunden!",true); break;
- case 104: show_error("Fehler beim Öffnen der Index Datei",true); break;
- case 105: show_error("Fehler beim Öffnen des neuen Archivs!",true); break;
- case 106: show_error("Fehler beim Öffnen des neuen Indexs!",true); break;
- case 107: show_error("Nicht gefunden!",true); break;
- case 108: show_error("Fehler beim Lesen der Datei!",true); break;
- }
- if(ret>100) game_end(); //Fehler aufgetreten
- return ret;
Extract():
und Delete():
Und hier der C++ Code:
C-Quellcode
- #include <windows.h>
- #include <string>
- #include <fstream>
- #include <sys/stat.h>
- using namespace std;
- #define GMExport extern "C" __declspec (dllexport)
- //Fehlerkonstanten
- #define ERR_OPEN_FILE 101
- #define ERR_OPEN_ARCHIV 102
- #define ERR_FILE_NOT_FOUND 103
- #define ERR_OPEN_INDEX 104
- #define ERR_OPEN_NEW_ARCHIV 105
- #define ERR_OPEN_NEW_INDEX 106
- #define ERR_NOT_FOUND 107
- #define ERR_READING_FILE 108
- long filesize(string filename) {
- struct stat results;
- if (stat(filename.c_str(), &results) == 0)
- return results.st_size;
- }
- int add_file(LPSTR archiv,LPSTR file,LPSTR index,LPSTR name) {
- long start,end;
- string archivs=archiv,files=file;
- char buffer[8000]="";
- ifstream f;
- ofstream a;
- f.open(file, ios_base::in | ios_base::binary);
- a.open(archiv,ios_base::out | ios_base::binary | ios_base::app);
- a.seekp(filesize(archivs));
- start=a.tellp();
- if(!f) {
- return ERR_OPEN_FILE;
- }
- if(!a) {
- return ERR_OPEN_ARCHIV;
- }
- while(f.tellg()+8000<filesize(files)) {
- f.read(buffer,8000);
- a.write(buffer,8000);
- }
- while(!f.eof()) {
- f.read(buffer,filesize(files)-f.tellg());
- a.write(buffer,8000);
- }
- end=filesize(file);
- f.close();
- a.close();
- ofstream i;
- i.open(index,ios_base::out | ios_base::app);
- if(!i) {
- return ERR_OPEN_INDEX;
- }
- i << name << "*" << start << " " << end << endl;
- i.close();
- return 1;
- }
- int delete_file(string archiv,string file,string index) {
- ifstream i;
- i.open(index.c_str(),ios_base::in);
- if(!i) {
- return ERR_OPEN_INDEX;
- }
- int n;
- string a_name[8000],name_start,end,name,startt,narchiv;
- long a_start[8000],a_end[8000],astart;
- n=0;
- while(!i.eof()) {
- i >> name_start;
- i >> end;
- name=name_start.substr(0,name_start.find("*",0));
- a_name[n]=name;
- startt=name_start.substr(name_start.find("*",0)+1,name_start.length()-name_start.find("*",0));
- a_start[n]=atoi(startt.c_str());
- a_end[n]=atoi(end.c_str());
- n++;
- }
- n--;
- i.close();
- //Datei finden
- bool found=false;
- for(int i=0;i<=n;i++) {
- if(a_name[i]==file) {
- found=true;
- ifstream a;
- ofstream an;
- narchiv=archiv+".tmp";
- a.open(archiv.c_str(),ios_base::in | ios_base::binary);
- an.open(narchiv.c_str(),ios_base::out | ios_base::binary);
- if(!a) {
- return ERR_OPEN_ARCHIV;
- }
- if(!an) {
- return ERR_OPEN_NEW_ARCHIV;
- }
- char buffer[8000];
- while(a.tellg()+8000<=a_start[i]) {
- a.read(buffer,8000);
- an.write(buffer,8000);
- }
- while(a.tellg()<a_start[i]) {
- a.read(buffer,1);
- an.write(buffer,1);
- }
- if(i<n) {
- a.seekg(a_start[i+1]);
- while(a.tellg()+8000<filesize(archiv)) {
- a.read(buffer,8000);
- an.write(buffer,8000);
- }
- while(a.tellg()<filesize(archiv)) {
- a.read(buffer,1);
- an.write(buffer,1);
- }
- }
- a.close();
- an.close();
- //Index neu erstellen
- ofstream nin;
- string nindex;
- nindex=index+".tmp";
- nin.open(nindex.c_str(),ios_base::out);
- if(!nin) {
- return ERR_OPEN_NEW_INDEX;
- }
- if(i==n) n--;
- for(int j=0;j<n;j++) {
- if(j!=i) {
- if(j<i) astart=a_start[j];
- if(j>i) astart=a_start[j]-a_start[i];
- nin << a_name[j] << "*" << astart << " " << a_end[j] << endl;
- }
- }
- nin.close();
- }
- }
- return 1;
- }
- int extract_file(string archiv,string file,string index,string oname) {
- string name_start,fname,ends,startt,end,name;
- long start;
- ifstream i;
- i.open(index.c_str(),ios_base::in);
- if(!i) {
- return ERR_OPEN_INDEX;
- }
- int n;
- string a_name[8000];
- long a_start[8000],a_end[8000];
- n=0;
- while(!i.eof()) {
- i >> name_start;
- i >> end;
- name=name_start.substr(0,name_start.find("*",0));
- a_name[n]=name;
- startt=name_start.substr(name_start.find("*",0)+1,name_start.length()-name_start.find("*",0));
- a_start[n]=atoi(startt.c_str());
- a_end[n]=atoi(end.c_str());
- n++;
- }
- n--;
- i.close();
- //Datei finden
- bool found=false;
- for(int i=0;i<=n;i++) {
- if(a_name[i]==file) {
- found=true;
- ifstream a;
- ofstream o;
- a.open(archiv.c_str(),ios_base::in | ios_base::binary);
- o.open(oname.c_str(),ios_base::out | ios_base::binary);
- if(!a) {
- return ERR_OPEN_ARCHIV;
- }
- if(!o) {
- return ERR_OPEN_FILE;
- }
- char buffer[8000];
- a.seekg(a_start[i]);
- while(a.tellg()+8000<a_end[i]+a_start[i]) {
- a.read(buffer,8000);
- o.write(buffer,8000);
- }
- while(a.tellg()<a_end[i]+a_start[i]) {
- a.read(buffer,1);
- o.write(buffer,1);
- }
- a.close();
- o.close();
- }
- }
- if(!found) {
- return ERR_NOT_FOUND;
- }
- return 1;
- }
- int crypt_archiv(string archiv,string key) { //Funktioniert noch nicht!
- ifstream a;
- ofstream an;
- string buffers,narchiv;
- narchiv=archiv+".tmp";
- a.open(archiv.c_str(),ios_base::binary | ios_base::in);
- an.open(narchiv.c_str(),ios_base::binary | ios_base::out);
- if(!a) return ERR_OPEN_ARCHIV;
- if(!an) return ERR_OPEN_NEW_ARCHIV;
- char buffer[8000];
- while(a.tellg()<filesize(archiv)) {
- a.read(buffer,8000);
- buffers=buffer;
- for(int i=0;i<8000;i++) {
- buffers[i]=buffers[i]^key[i % key.length()];
- }
- an.write(buffers.c_str(),8000);
- }
- a.close();
- an.close();
- return 1;
- }
- GMExport double GM_Add_File(LPSTR archiv,LPSTR index,LPSTR file,LPSTR name) {
- return (double)add_file(archiv,file,index,name);
- }
- GMExport double GM_Extract_File(LPSTR archiv,LPSTR index,LPSTR file,LPSTR outputn) {
- string tmparchiv,tmpindex,tmpfile,tmpoutput;
- tmparchiv=archiv;
- tmpfile=file;
- tmpindex=index;
- tmpoutput=outputn;
- return (double)extract_file(tmparchiv,tmpfile,tmpindex,tmpoutput);
- }
- GMExport double GM_Delete_File(LPSTR archiv,LPSTR index,LPSTR file) {
- string tmparchiv,tmpindex,tmpfile;
- tmparchiv=archiv;
- tmpindex=index;
- tmpfile=file;
- return (double)delete_file(tmparchiv,tmpfile,tmpindex);
- }
- GMExport double __GM_Crypt_Archiv(LPSTR archiv,LPSTR key) {
- string tmparchiv,tmpkey;
- tmparchiv=archiv;
- tmpkey=key;
- return (double)crypt_archiv(tmparchiv,tmpkey);
- }
(Tut mir leid für den langen Code)
Ich denke der Fehler ist in der C++ Datei, aber ich find ihn nicht

Bitte helft mir


Mein PC: WinXP Pro | 3 GHz x 2 | 1024 MB RAM | Intel Grafikchip, 224MB