Zum Inhalt springen

C-Code beschleunigen und als Dll kompilieren


Empfohlene Beiträge

Geschrieben

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

Geschrieben
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).

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...