FaVorith Geschrieben 11. März 2006 Teilen Geschrieben 11. März 2006 Hallo! Ich habe mir aus dem Internet einen C-Code heruntergeladen, welcher den Hash einer Datei mit dem Adler-32-Algorithmus berechnet. In der Windows-Eingabeaufforderung klappt das auch alles wunderbar (der Code wurde mit Visual C++ in eine Exe kompiliert), allerdings möchte ich aus dem Code nun eine Dll erzeugen, welche ich aus meinem Visual Basic-Programm heraus aufrufen kann. Daher muss ich den Code etwas verändern: Es soll nur noch ein Argument übergeben werden können (Pfad und Dateiname), außerdem sollen die Fehlermeldungen entfernt werden (es soll höchstens eine Fehlernummer zurückgegeben werden, welche ich in meinem Visual Basic-Programm auswerte) und es wäre auch toll, wenn man noch etwas machen könnte, um den Code nochmals zu beschleunigen. Und die wichtigste Anforderung: Der Code muss als 32Bit-Dll kompiliert werden können und die __stdcall-Konvention erfüllen. Leider kann ich die Aufgaben selbst nicht lösen, da ich nicht in C programmieren kann. Ich bin daher vollständig auf euch angewiesen und wäre euch wirklich dankbar, wenn ihr mir helfen könntet. Hier der Code: #include <stdio.h> #include <stdlib.h> unsigned long update_adler32(unsigned long old, unsigned char *buf, int len) { #define BASE 65521 /* largest prime smaller than 65536 */ unsigned long s1 = old & 0xffff; unsigned long s2 = (old >> 16) & 0xffff; int n; for (n = 0; n < len; n++) { s1 = (s1 + buf[n]) % BASE; s2 = (s2 + s1) % BASE; } return( (s2 << 16) + s1 ); } /* update_adler32() */ int main(int argc, char *argv[]) { int RetCode, BufferSize, Number; FILE *CheckFile; unsigned char *Memory; unsigned long Adler32, TotalNumber; printf("\n checksum - calculates the Adler32 checksum of a given file\n"); RetCode = 10; if (argc > 3) printf("\n error: too many arguments!\n"); else { if (argc == 3) BufferSize = atoi(argv[2]) * 1024; else BufferSize = 16*1024; /* voreingestellte Größe des Lesepuffers */ if (argc > 1) { CheckFile = fopen(argv[1], "rb"); if (CheckFile == NULL) { printf("\n error: could not open file for reading!\n"); } else { Memory = malloc(BufferSize); if (Memory == NULL) printf("\n error: could not allocate enough memory!\n"); else { printf("\n calculating checksum ..."); Adler32 = 1L; TotalNumber = 0L; do { Number = fread(Memory, 1, BufferSize, CheckFile); if (Number > 0) { Adler32 = update_adler32(Adler32, Memory, Number); TotalNumber += Number; } } while (Number > 0); printf("\r could read %lu bytes from file", TotalNumber); printf("\n adler checksum is $%08lx\n", Adler32); RetCode = 0; free(Memory); } fclose(CheckFile); } } else printf("\n usage: checksum <filename> [buffersize in kbytes]\n"); } return(RetCode); } /* Checksum.c Copyright (c) Christian Siebert */ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 11. März 2006 Teilen Geschrieben 11. März 2006 Ich habe mir aus dem Internet einen C-Code heruntergeladen, welcher den Hash einer Datei mit dem Adler-32-Algorithmus berechnet. Hast Du die nötigen Nutungsrechte? Daher muss ich den Code etwas verändern: Hast Du die nötigen Rechte, den Code verändern zu dürfen? Leider kann ich die Aufgaben selbst nicht lösen, da ich nicht in C programmieren kann. Wenn Du die beiden ersten Fragen nicht mit ja beantworten kannst, erübrigt sich der Rest. Zu den Fragen: - __stdcall vor den Funktionsnamen setzen, um die Aufrufkonvention anzupassen. - Die erste Funktion berechnet die Prüfsumme über einen Speicherbereich. Du musst also die Datei in den Speicher laden, so wie es die main Funktion tut. - Du kannst die main Funktion in eine neue Funktion umschreiben, der Du als Parameter den Dateinamen übergibst. Wenn Du dazu Fragen hast, dann stell sie ruhig. Ich denke nicht, dass Du jemanden finden wirst, der Dir die Arbeit abnimmt (siehe auch andere Postings (nicht von Dir) in letzter Zeit). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.