Fehler im Code Checksum
-
Hallo,
ich bin gerade dabei im meinem Praktikum ein C-Programm zu schreiben. Ich verwende Visual C++ 6.0.
Ich habe nun in das Programm in der Klasse CTestDlg eine Funktion Namens int Checksum (char File[255]) hinzugefügt. Diese Funktion habe ich von meinem Betreuer bekommen und soll verwendet werden, um die Checksumme einer Binärdatei zu berechnen. Der Dateiname inklusive Pfad wird als Parameter (File[255]) der Funktion übergeben.Mein Problem ist jetzt, das beim Funktionsaufruf sich das Programm aufhängt bzw. folgenden Fehler bringt:
Thread 0x3B8 wurde mit Code 0 (0x0) beendet.
Thread 0xE28 wurde mit Code 0 (0x0) beendet.Das einzige das ich an dem Code geändert habe ist folgendes:
ulFileSize = GetFileSize(hFile); IN ulFileSize = GetFileSize(hFile, NULL); WEIL ich eine Fehlermedlung bekommen habe.Zusätzlich bekomm ich eine Fehlermeldung wenn ich folgendes in der Funktion stehen habe:
MessageBox("Quelldatei kann nicht geöffnet werden!", "Fehler", MB_OK);Fehermeldung:
error C2660: 'MessageBoxA' : Funktion akzeptiert keine 3 ParameterWenn ich allerdings nur einen oder zwei Parameter verwende, kommt dieselbe Fehlermeldung mit der entsprechenden Parameterzahl.
Kann mir jemand bei meinem Problem helfen?
Hier noch der Code:
int Checksum(char szFile[255]) { int iRetVal; // return value (checksum) unsigned short *pBuffer, // pointer to buffer Byte1, // hex numbers Byte2; unsigned int uiLoop; // loop counter FILE *hFile; // file handle unsigned short buffer[500000]; // buffer for file contents long lArrayAdr; unsigned long ulFileSize; // size of source file // initialize buffer memset(buffer, 0, 256); // open file read-only and binary if((hFile = fopen(szFile,"rb")) == NULL) { MessageBox("Quelldatei kann nicht geöffnet werden!", "Fehler", MB_OK); iRetVal = -1; } else { // get file size ulFileSize = GetFileSize(hFile, NULL); // read 16-bit values into array fread(buffer, sizeof(short), ulFileSize, hFile); // swap bytes and add them for(uiLoop = 0; uiLoop <= (ulFileSize>>1); uiLoop++) { Byte1 = buffer[uiLoop] & 0x00ff; Byte2 = buffer[uiLoop] & 0xff00; Byte2 >>= 8; buffer[uiLoop] = Byte2 + (Byte1 * 0x0100); } // set pointer to address of first element in array pBuffer = &buffer[0]; lArrayAdr = (long)pBuffer; iRetVal = CalcCRC(pBuffer, ulFileSize, lArrayAdr); fclose(hFile); } return iRetVal; }Gruß Zizou
Mod-Edit: Ich war mal so frei, deinen Quelltext vernünftig zu formatieren. mfG CStoll
-
Verwende Code Tags.
MessageBox braucht 4 Parameter, guck das in der MSDN nach.
-
Um MessageBox() in dieser Funktion zu verwenden, musst du entweder die gesamte Funktion als Member deiner CTestDlg Klasse deklarieren oder du übergibst der MessageBox auch einfach so das Handle.
-
Sorry,
aber ich bin Anfänger.
Was sind Code Tags bzw. wie würden die mir helfen?Gruß Zizou
-
Code Tags sorgen dafür, dass dein Code hier im Forum zumindest ordentlich dargestellt wird.
-
Hallo,
alles klar. Werd nächstes mal Code Tags verwenden.Kann mir jemand bei meinem eigentlichen Problem helfen, warum die Funktion nicht funktioniert?
Gruß Zizou
-
Also dann zitiere ich mich mal selbst:
dfgidga schrieb:
Um MessageBox() in dieser Funktion zu verwenden, musst du entweder die gesamte Funktion als Member deiner CTestDlg Klasse deklarieren oder du übergibst der MessageBox auch einfach so das Handle.
-
Hallo,
dann zitier ich mich halt auch mal selbst:Zizou schrieb:
Mein Problem ist jetzt, das beim Funktionsaufruf sich das Programm aufhängt bzw. folgenden Fehler bringt:
Thread 0x3B8 wurde mit Code 0 (0x0) beendet.
Thread 0xE28 wurde mit Code 0 (0x0) beendet.Das einzige das ich an dem Code geändert habe ist folgendes:
ulFileSize = GetFileSize(hFile); IN ulFileSize = GetFileSize(hFile, NULL); WEIL ich eine Fehlermedlung bekommen habe.Kann das an der Methode GetFileSize liegen?
Gruß Zizou
-
Nein, es liegt nicht an deiner Änderung, es liegt vermutlich daran dass du den Code aus einer Klasse rauskopiert hast die von CWnd abgeleitet ist.
Lies es bitte einfach in der MSDN nach.
Falls du Visual Studio verwendest drück einfach mal F1, falls du nen anderen Compiler verwendest: http://msdn.microsoft.com/
-
Es könnte auch problematisch sein, daß ein FILE* etwas anderes ist als ein HANDLE
(GetFileSize() erwartet letzteres).PS: Was die Mitteilungen "Thread xyz wurde beendet" mit deinem Problem zu tun haben, bin ich leider überfragt - vermutlich gar nichts.
-
Hallo,
bin immer noch an meinem Problem mit der Dateigröße.
unsigned long ulFileSize = GetFileSize(hFile, NULL);Hab herausgefunden bzw. bemerkt, dass hier immer der gleiche Wert übergeben wird: 4294967295
Dadurch das der Wert so groß ist, hängt sich das Programm auf.
Aber warum bekomme ich da einen falschen Wert? (meine Dateien sind max. 6KB groß)
Es kann nur noch an diesem Befehl liegen, denn mit einem konstanten Wert funktioniert das Programm.
Gruß Zizou
-
Ja, es liegt an diesem Befehl - genauer gesagt daran, daß du ihm die falschen Parameter übergibst. GetFileSize() erwartet ein Datei-Handle (das bekommst du z.B. von CreateFile()), keinen FILE*. (und wenn ich raten müsste, würde ich sagen, daß GetLastError() sowas wie "Invalid Handle" ausspucken dürfte)
-
Bau mit fseek und ftell ein "kompatibles" GetFileSize.
