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 */