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:
Alles anzeigen
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:
Quellcode
- #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 */