[Geloest] MD5-Hash aus AnsiString
-
Hallo,
ich habe das hier gefunden und konnte das wunderbar mit dem Borland C++ Builder 3 verwenden. Nun nutze ich ueberwiegend Borland C++ Builder 5 und hier erhalte ich auf einmal folgende Fehlermeldungen:
[Linker Fehler] Unresolved external 'CMD5::~CMD5()' referenced from Z:\PROJEKTE\PROGRAMMIERUNG\CPP\HA\HA_MAIN.OBJ [Linker Fehler] Unresolved external 'CMD5::CMD5()' referenced from Z:\PROJEKTE\PROGRAMMIERUNG\CPP\HA\HA_MAIN.OBJ [Linker Fehler] Unresolved external 'CMD5::setPlainText(const char *)' referenced from Z:\PROJEKTE\PROGRAMMIERUNG\CPP\HA\HA_MAIN.OBJ [Linker Fehler] Unresolved external 'CMD5::getMD5Digest()' referenced from Z:\PROJEKTE\PROGRAMMIERUNG\CPP\HA\HA_MAIN.OBJ
Im Header binde ich die besagte Datei
md5class.h
ein, in der cpp-Datei verwende ich exakt die auf der Seite repraesentierte Funktion, natuerlich entsprechend im Header deklariert. Ich habe auch schon alle anderen enthaltenen Header eingebunden versucht sowie alle cpp-Dateien und/oder obj-Dateien dem Projekt hinzugefuegt. Dann erhalte ich teilweise noch andere Meldungen.Muss ich jetzt wirklich im BCB 3 ein DLL-Projekt starten und dann eine DLL-Funktion im BCB5-Projekt aufrufen?
-
Hast du auch die im Thread erwähnten cpp-Dateien mit in dein Projekt eingebunden? Wenn dann andere Fehler kamen, wie lauteten die dann?
-
Ja, habe ich. Genau weiss ich die Meldungen nicht mehr, bin gerade nicht zuhause. Ich wuerde diese dann nochmal mitteilen. Tatsache ist aber, dass es mit BCB3 schon geklappt hatte. Im Dev-C++ gleiches Problem.
-
Also, wenn ich
md5class.cpp
dem Projekt hinzufuege, erhalte ich:[C++ Warnung] ha_main.cpp(20): W8066 Code wird nie erreicht. [Linker Fehler] Unresolved external '_MD5Init' referenced from \\x.x.x.x\freigabe\PROJEKTE\PROGRAMMIERUNG\CPP\MD5\MD5CLASS.OBJ [Linker Fehler] Unresolved external '_MD5Update' referenced from \\x.x.x.x\freigabe\PROJEKTE\PROGRAMMIERUNG\CPP\MD5\MD5CLASS.OBJ [Linker Fehler] Unresolved external '_MD5Final' referenced from \\x.x.x.x\freigabe\PROJEKTE\PROGRAMMIERUNG\CPP\MD5\MD5CLASS.OBJ
Und wenn ich noch dazu
md5c.cpp
einbinde, wird in selbiger die Zeile 102 markiert:void MD5Init (context)
und dazu erscheinen folgende Meldungen:
[C++ Fehler] md5c.cpp(102): E2451 Undefiniertes Symbol 'context' [C++ Fehler] md5c.cpp(104): E2040 Deklaration nicht ordnungsgemäß abgeschlossen [C++ Fehler] md5c.cpp(122): E2040 Deklaration nicht ordnungsgemäß abgeschlossen [C++ Fehler] md5c.cpp(164): E2040 Deklaration nicht ordnungsgemäß abgeschlossen [C++ Fehler] md5c.cpp(193): E2040 Deklaration nicht ordnungsgemäß abgeschlossen [C++ Fehler] md5c.cpp(287): E2238 Bezeichner 'input' mehrfach deklariert [C++ Fehler] md5c.cpp(120): E2344 'input' bereits deklariert [C++ Fehler] md5c.cpp(289): E2040 Deklaration nicht ordnungsgemäß abgeschlossen [C++ Fehler] md5c.cpp(305): E2238 Bezeichner 'input' mehrfach deklariert [C++ Fehler] md5c.cpp(287): E2344 'input' bereits deklariert [C++ Fehler] md5c.cpp(306): E2238 Bezeichner 'len' mehrfach deklariert [C++ Fehler] md5c.cpp(288): E2344 'len' bereits deklariert [C++ Fehler] md5c.cpp(307): E2040 Deklaration nicht ordnungsgemäß abgeschlossen [C++ Fehler] md5c.cpp(320): E2238 Bezeichner 'input' mehrfach deklariert [C++ Fehler] md5c.cpp(305): E2344 'input' bereits deklariert [C++ Fehler] md5c.cpp(321): E2238 Bezeichner 'len' mehrfach deklariert [C++ Fehler] md5c.cpp(306): E2344 'len' bereits deklariert [C++ Fehler] md5c.cpp(322): E2040 Deklaration nicht ordnungsgemäß abgeschlossen [C++ Fehler] md5c.cpp(335): E2238 Bezeichner 'len' mehrfach deklariert [C++ Fehler] md5c.cpp(321): E2344 'len' bereits deklariert [C++ Fehler] md5c.cpp(336): E2040 Deklaration nicht ordnungsgemäß abgeschlossen
-
Hallo,
so sieht das bei mir auf dem CBuilder 6 Pro aus und funktioniert einwandfrei.
md5c.cpp md5class.cpp
dem Projekt hinzugefügt und fertig
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "md5class.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- String getMD5(String s) { CMD5 md5; md5.setPlainText((char*)s.c_str()); return md5.getMD5Digest(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { ShowMessage (getMD5 (Edit1->Text)); }
Gruß myerscola
-
Hatte vor einger Zeit auch nach einer MD5-Funktion gesucht. Hatte bestimmt 10 verschiedene Cpps und bei allen bekam ich auch unresolved external-Errors..
Hab keine Ahnung woran das liegen könnte.
-
Ich habe es gerade eben auch getestet und es funktioniert. Es gibt zwar ein Haufen Warnungen, da in der md5.cpp noch sehr veralteter Syntax verwendet wird aber funktionieren tuts (BCB5).
-
myerscola schrieb:
Hallo,
so sieht das bei mir auf dem CBuilder 6 Pro aus und funktioniert einwandfrei.
md5c.cpp md5class.cpp
dem Projekt hinzugefügt und fertig
Wenn ich so verfahre, erhalte ich o.g. Meldungen. Auch, wenn ich
#include "md5class.h"
angebe, also ohne den eigentlichen Pfad zu beruecksichtigen.
-
Also, nun habe ich mich fuer die BCB3-DLL entschieden. Diese sieht folgendermassen aus:
#include "md5class.h" #include <vcl.h> #pragma hdrstop char* getMD5(char* s) { CMD5 md5; md5.setPlainText(s); return (char*)md5.getMD5Digest(); } int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) { return 1; }
Diese konnte ich auch einwandfrei erstellen, ausser dass es die besagten Warnungen gab.
Und die entsprechende Implementierung in meiner BCB5-Projektheader:
class TDLLHash { private: typedef char* (DLLFUNCTION)(char*); DLLFUNCTION *pDllFunction; public: TDLLHash(); char* CallDllFunction(char* s); };
Und die Funktionen in der CPP:
TDLLHash::TDLLHash() { HINSTANCE hInstance; hInstance = ::LoadLibrary("hash.dll"); pDllFunction=(DLLFUNCTION*)::GetProcAddress((HMODULE)hInstance,"getMD5"); } char* TDLLHash::CallDllFunction(char* s) { char* c=(*pDllFunction)(s); return c; } //... String __fastcall TfMain::GetMD5(String s) { TDLLHash dllHash; return String(dllHash.CallDllFunction(s.c_str())); }
Leider erhalte ich nun einen Exception-Fehler wegen Zugriffsverletzung bei 0x00000000...
Was mache ich falsch? - Ich muss dazu sagen, dass ich noch nie eine DLL verwendet oder gar erstellt habe.
-
Warum willst du denn unbedingt eine dll erstellen?
Versuche erstmal deine Linkerfehler zu beseitigen. Du hast mit Sicherheit irgendwas vergessen in dein Projekt einzubinden oder hast du die md5class.cpp geändert?
-
Ich habe gar keine Datei geaendert und bin haar genau so vorgegangen, wie mit dem BCB3. Beim BCB3 laeuft's, beim BCB5 bekomme ich o.g. Fehlermeldungen. Ich bin das mittlerweile 20 mal durchgegangen, Schritt fuer Schritt.
Darum muss ich wohl eine dll im BCB3 erstellen, um diese dann in meinem eigentlichen Projekt einbinden zu koennen. Zwar nicht die schoenste Loesung, aber wenn's halt nicht anders klappt...
-
Es geht auch mit dem BCB5. Ich habe es selber probiert, wie ich vorhin auch schon geschrieben habe.
Wenn du willst, kannst du mir ja dein Projekt per Mail schicken, dann schau ich mir das mal an.
-
Ich habe auch schon ein neues Projekt gestartet, nur mit dieser MD5-Funktionalitaet, habe die besagten beiden CPP-Dateien eingebunden, den Header includiert und es kommen dieselben Fehler, im BCB3 funktioniert's aber. Also scheint meine BCB5-Version 'ne Macke zu haben. Ich muss aber mit dem Projekt damit arbeiten, weil der BCB3 dafuer zu alt ist. Also gehe ich diesen Kompromiss ein.
Nun waere ich allerdings froh, wenn man mir dabei weiterhelfen koennte.
-
Gerade mal noch das hier gefunden: http://www.md5hashing.com/c++/
Werd' ich nachher gleich mal ausprobieren.
-
Oh Mann, mein BCB5 hat wirklich 'n Knacks weg. Jetzt bekomme ich beim Ausfuehren vom BCB heraus die Meldung: "Vorgang kann nicht erzeugt werden: Der Verzeichnisname ist ungueltig." Gehe ich allerdings ueber
Projekt -> xxx erzeugen
, wird die Anwendung anstandslos erzeugt und funktioniert auch beim Ausfuehren der exe.Also mit der vorhin besagten Klasse funktioniert's nun endlich mal. Geloest.