C-Code beschleunigen und als Dll kompilieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • C-Code beschleunigen und als Dll kompilieren

    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:

    Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. unsigned long update_adler32(unsigned long old, unsigned char *buf, int len)
    4. {
    5. #define BASE 65521 /* largest prime smaller than 65536 */
    6. unsigned long s1 = old & 0xffff;
    7. unsigned long s2 = (old >> 16) & 0xffff;
    8. int n;
    9. for (n = 0; n < len; n++)
    10. {
    11. s1 = (s1 + buf[n]) % BASE;
    12. s2 = (s2 + s1) % BASE;
    13. }
    14. return( (s2 << 16) + s1 );
    15. } /* update_adler32() */
    16. int main(int argc, char *argv[])
    17. {
    18. int RetCode, BufferSize, Number;
    19. FILE *CheckFile;
    20. unsigned char *Memory;
    21. unsigned long Adler32, TotalNumber;
    22. printf("\n checksum - calculates the Adler32 checksum of a given file\n");
    23. RetCode = 10;
    24. if (argc > 3) printf("\n error: too many arguments!\n");
    25. else
    26. {
    27. if (argc == 3) BufferSize = atoi(argv[2]) * 1024;
    28. else BufferSize = 16*1024; /* voreingestellte Größe des Lesepuffers */
    29. if (argc > 1)
    30. {
    31. CheckFile = fopen(argv[1], "rb");
    32. if (CheckFile == NULL)
    33. {
    34. printf("\n error: could not open file for reading!\n");
    35. }
    36. else
    37. {
    38. Memory = malloc(BufferSize);
    39. if (Memory == NULL)
    40. printf("\n error: could not allocate enough memory!\n");
    41. else
    42. {
    43. printf("\n calculating checksum ...");
    44. Adler32 = 1L;
    45. TotalNumber = 0L;
    46. do {
    47. Number = fread(Memory, 1, BufferSize, CheckFile);
    48. if (Number > 0)
    49. {
    50. Adler32 = update_adler32(Adler32, Memory, Number);
    51. TotalNumber += Number;
    52. }
    53. } while (Number > 0);
    54. printf("\r could read %lu bytes from file", TotalNumber);
    55. printf("\n adler checksum is $%08lx\n", Adler32);
    56. RetCode = 0;
    57. free(Memory);
    58. }
    59. fclose(CheckFile);
    60. }
    61. } else printf("\n usage: checksum <filename> [buffersize in kbytes]\n");
    62. }
    63. return(RetCode);
    64. } /* Checksum.c Copyright (c) Christian Siebert */
    Alles anzeigen