DLL einbinden...
-
Ja, ich hab's 10 mal überprüft, die Namen stimmen alle überein(s.u.).
In der dll hab' ich nur folgendes im Vereinbarungsteil stehn:
extern "C" __declspec(dllexport) String GetCodedText(String, String); extern "C" __declspec(dllexport) String GetNormalText(String, String);
Hab' ich was falsch gemacht???
UND: Was heißt case-sensitive???
[ Dieser Beitrag wurde am 02.03.2003 um 21:00 Uhr von aaaabyx editiert. ]
-
Verwende ebenfalls dllexport in deinem Projekt.
-
Das läuft genau aufs gleiche hinaus...
-
Zeig mal, wie die zweite Funktion aussieht.
-
im Vereingarungsteil:
char Annalyt[208];
String GetNormalText(String NCodedTextIm, String NPasswordIm) { Annalyt[1]='0'; Annalyt[2]='1'; Annalyt[3]='2';
...
...
Haufen von 208 zuweisungen...
...
...Annalyt[206]='>'; Annalyt[207]='|'; Annalyt[208]=' '; AnsiString NCodedText=NCodedTextIm; AnsiString NPassword=NPasswordIm; AnsiString BackNormalText; int g=1; int f=1; while (NCodedText.Length()>BackNormalText.Length()) { int z1=1; bool Done2=false; while ((z1<=208)&&(Done2==false)) { if (NCodedText[g]==Annalyt[z1]) { Done2=true; } else { z1++; } } int z2=1; Done2=false; while ((z2<=208)&&(Done2==false)) { if (NPassword[f]==Annalyt[z2]) { Done2=true; } else { z2++; } } int e2=z1+104-z2; BackNormalText=BackNormalText+Annalyt[e2]; g++; if (f==NPassword.Length()) { f=1; } else { f++; } } return BackNormalText; }
Es ist noch nicht die Ausgereifte Version...
[ Dieser Beitrag wurde am 02.03.2003 um 21:34 Uhr von aaaabyx editiert. ]
-
Ist bei dir in "Projekt->Optionen->Linker" das Kästchen "Dynamische RTL verwenden" angeklickt oder nicht?
-
Nein.
-
Aha. Wenn du es anklickst, dann läuft es. Schau dir mal genau den Text an, der ganz oben im Code deiner DLL steht. Der steht da nämlich nicht umsonst!
-
Es läuft alles aufs selbe hinaus:
Ich habe jetzt die dll geöffnet, Dynamische RTL verwenden aktiviert, das Projekt neu compiliert und gespeichert... Funktioniert nicht... Auch nicht, wenn ich das selbe mit dem Aufrufenden Projekt mache...
Auch, wenn ich BCBMM.lib zum Projekt hinzufüge, funktioniert es nicht...
-
Mist... Entschuldigt dass ich euch so lange mit diesem Problem aufgehalten habe... Ich habe etwas Scheiße gebaut... Ich habe die ganze Zeit in meinem Projekt 'ne Uralt-Lib verwendet... Da war die Funktion noch nicht deklariert
Aber jetzt gibt's immer noch das Problem mit der MessageBox (Ungültige Zeichenoperation, die es bei beiden Funktionen gibt..) Kann mir da jemand helfen?
-
Also die Fehlermeldung heißt "Ungültige Zeigeroperation"... Hatte das jemand schon mal???
Der Fehler tritt nur auf, wenn ich die Funktion aus der DLL lade... Habe ich sie im Projekt mit drin, Gibt es keine Fehlermeldung.[ Dieser Beitrag wurde am 03.03.2003 um 13:38 Uhr von aaaabyx editiert. ]
-
Es hilft nichts, du musst wohl den Code hier posten. Kommt der Fehler auch, wenn du die Funktionen aus der DLL garnicht verwendest? Wenn du also einfach nur die DLL statisch linkst?
-
Guck mal oben, da steht der Code... Der hat den gleichen Fehler... Aber zur Sicherheit poste ich nochmal den Aktuellen(optimiert):
//--------------------------------------------------------------------------- #include <vcl\vcl.h> #pragma hdrstop //--------------------------------------------------------------------------- // Wichtiger Hinweis zur DLL-Speicherverwaltung: // // Um die Bibliothek BCBMM.LIB zu verwenden, muß diese zum DLL-Projekt und // allen EXE-Projekten geladen werden. Dies gilt, falls Ihre DLL eine // Funktion exportiert, die Stringobjekte (oder verschachtelte Strings in // Structs/Classes) als Parameter übergibt. Dies modifiziert die DLL und deren // Programme so, daß die Datei BCBMM.DLL als dessen Speichermanager verwendet // wird. In diesen Fällen muß die Datei BCBMM.DLL mit Ihrer DLL weitergegeben // werden. // // Um die Verwendung der BCBMM.DLL zu vermeiden, sollten // String-Parameter unter Verwendung von "char *" oder ShortString-Parameter // übergeben werden. //--------------------------------------------------------------------------- extern "C" __declspec(dllexport) String GetCodedText(String, String); extern "C" __declspec(dllexport) String GetNormalText(String, String); char Annalyt[103]; //--------------------------------------------------------------------------- USERES("Codeworks.res"); USELIB("\Johannes\Programme\C++ Builder\CBuilder\LIB\BCBMM.LIB"); //--------------------------------------------------------------------------- int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) { return 1; } //--------------------------------------------------------------------------- void AnnalytInit(void) { Annalyt[1]='0'; Annalyt[2]='1'; Annalyt[3]='2'; Annalyt[4]='3'; Annalyt[5]='4'; Annalyt[6]='5'; Annalyt[7]='6'; Annalyt[8]='7'; Annalyt[9]='8'; Annalyt[10]='9'; Annalyt[11]='A'; Annalyt[12]='B'; Annalyt[13]='C'; Annalyt[14]='D'; Annalyt[15]='E'; Annalyt[16]='F'; Annalyt[17]='G'; Annalyt[18]='H'; Annalyt[19]='I'; Annalyt[20]='J'; Annalyt[21]='K'; Annalyt[22]='L'; Annalyt[23]='M'; Annalyt[24]='N'; Annalyt[25]='O'; Annalyt[26]='P'; Annalyt[27]='Q'; Annalyt[28]='R'; Annalyt[29]='S'; Annalyt[30]='T'; Annalyt[31]='U'; Annalyt[32]='V'; Annalyt[33]='W'; Annalyt[34]='X'; Annalyt[35]='Y'; Annalyt[36]='Z'; Annalyt[37]='Ä'; Annalyt[38]='Ö'; Annalyt[39]='Ü'; Annalyt[40]='a'; Annalyt[41]='b'; Annalyt[42]='c'; Annalyt[43]='d'; Annalyt[44]='e'; Annalyt[45]='f'; Annalyt[46]='g'; Annalyt[47]='h'; Annalyt[48]='i'; Annalyt[49]='j'; Annalyt[50]='k'; Annalyt[51]='l'; Annalyt[52]='m'; Annalyt[53]='n'; Annalyt[54]='o'; Annalyt[55]='p'; Annalyt[56]='q'; Annalyt[57]='r'; Annalyt[58]='s'; Annalyt[59]='t'; Annalyt[60]='u'; Annalyt[61]='v'; Annalyt[62]='w'; Annalyt[63]='x'; Annalyt[64]='y'; Annalyt[65]='z'; Annalyt[66]='ä'; Annalyt[67]='ö'; Annalyt[68]='ü'; Annalyt[69]=','; Annalyt[70]='.'; Annalyt[71]=';'; Annalyt[72]=':'; Annalyt[73]='°'; Annalyt[74]='!'; Annalyt[75]='@'; Annalyt[76]='²'; Annalyt[77]='§'; Annalyt[78]='³'; Annalyt[79]='$'; Annalyt[80]='%'; Annalyt[81]='&'; Annalyt[82]='/'; Annalyt[83]='{'; Annalyt[84]='('; Annalyt[85]='['; Annalyt[86]=')'; Annalyt[87]=']'; Annalyt[88]='='; Annalyt[89]='}'; Annalyt[90]='ß'; Annalyt[91]='?'; Annalyt[92]='µ'; Annalyt[93]='+'; Annalyt[94]='*'; Annalyt[95]='~'; Annalyt[96]='#'; Annalyt[97]='"'; Annalyt[98]='-'; Annalyt[99]='_'; Annalyt[100]='<'; Annalyt[101]='>'; Annalyt[102]='|'; Annalyt[103]=' '; } String GetCodedText(String NormalTextIm, String PasswordIm) { AnnalytInit(); AnsiString NormalText=NormalTextIm; AnsiString Password=PasswordIm; AnsiString CodedText; int a=1; int b=1; while (NormalText.Length()>CodedText.Length()) { int y=1; bool Done=false; while((y<=103)&&(Done==false)) { if (NormalText[a]==Annalyt[y]) { Done=true; } else { y++; } } int z=1; Done=false; while((z<=103)&&(Done==false)) { if (Password[b]==Annalyt[z]) { Done=true; } else { z++; } } int e=y+z; if (e>103) { e=e-103; } CodedText = CodedText + Annalyt[e]; a++; if (b==Password.Length()) { b=1; } else { b++; } } return CodedText; } String GetNormalText(String NCodedTextIm, String NPasswordIm) { AnnalytInit(); AnsiString NCodedText=NCodedTextIm; AnsiString NPassword=NPasswordIm; AnsiString BackNormalText; int g=1; int f=1; while (NCodedText.Length()>BackNormalText.Length()) { int z1=1; bool Done2=false; while ((z1<103)&&(Done2==false)) { if (NCodedText[g]==Annalyt[z1]) { Done2=true; } else { z1++; } } int z2=1; Done2=false; while ((z2<=103)&&(Done2==false)) { if (NPassword[f]==Annalyt[z2]) { Done2=true; } else { z2++; } } int e2=z1+103-z2; if (e2>103) { e2=e2-103; } BackNormalText=BackNormalText+Annalyt[e2]; g++; if (f==NPassword.Length()) { f=1; } else { f++; } } return BackNormalText; }
Ok, das ist jetzt die ganze dll...
Ich hoffe das ist jetzt nicht 'n bisschen lang geworden...
Der Fehler tritt auf, wenn ich die Funktion ausführen will(die Funktion funktioniert aber so wie sie soll).
-
Ich hab mir mal die ersten paar Zeilen von GetCodedText() angeschaut. Grauenhaft!!!
while (NormalText.Length()>CodedText.Length())
In CodedText steht doch noch garnichts drin! Weiter:
if (NormalText[a]==Annalyt[y])
1. Du vergleichst hier 2 Variablen vom Typ char*. Du fragst also, ob sie an der gleichen Adresse stehen. Das ist sicherlich nicht das, was du willst. Benutzen strcmp().
2. Woher willst du wissen, dass NormalText auch mindestens so viele Zeichen enthält wie a groß sein kann???Dein Code sieht insgesamt schrecklich aus. Strukturiere ihn, damit du Übersicht bekommst. Benutze dazu Einrückungen von mindestens 2 Zeichen (ich nehme stets 3) und benutze so wenig geschweifte Klammern wie möglich. Statt
if (Password[b]==Annalyt[z]) { Done=true; } else { z++; }
kannst du schreiben
if(Password[b] == Annalyt[z]) Done=true; else z++;
Vorteilhaft ist es auch, zwischen zwei Teilen Code, die nicht unmittelbar etwas miteinander zu tun haben, eine Leerzeile zu setzen. Nicht doof sind auch hier und da Kommentare, damit du auch später noch weißt, was nun die Operation in Zeile x eigentlich soll.
[ Dieser Beitrag wurde am 03.03.2003 um 14:58 Uhr von WebFritzi editiert. ]
-
In CodedText steht doch noch garnichts drin!
Noch nicht... Aber jedes mal wenn die While-Schleife ausgeführt wird kommt ein Buchstabe dazu...
CodedText = CodedText + Annalyt[e];
zu 1.: Ich versteh nicht, was das bedeuten soll...
2.: Guck mal in den Quelltext... CodedText kann nicht größer als NormalText
werden (while (NormalText.Length()>CodedText.Length())) und nach
jedem Durchlauf der While-Schleifemuss a=CodedText sein. D.H.: a kann
zwar größer als NormalText werden, dann ist jedoch die While-Schleife
nciht mehr erfüllt und es geschieht keine Abfrage (if (NormalText[a]
==Annalyt[y])) mehr geschehenUnd wie gesagt - Ich bin Anfänger. Aber ich werde deine Ratschläge beherzigen...
Lag das mit dem Fehler jetzt an dem char * - Vergleich oder wie???
[ Dieser Beitrag wurde am 03.03.2003 um 15:27 Uhr von aaaabyx editiert. ]
-
Original erstellt von aaaabyx:
Lag das mit der Box jetzt an dem char * - Vergleich oder wie???Wenn du Hilfe willst, solltest du dich klar ausdrücken! Ich weiß nicht, was du mit der "Box" meinst, aber der char*-Vergleich ist eine mögliche Fehlerquelle. Ich habe ehrlich gesagt keine Lust, deinen schrecklich strukturierten Code durchzuschauen. Ich kann dir nur noch sagen, dass du 1. CodedText initialisieren solltest (musst) durch z.B. "AnsiString CodedText = """, und dass du 2. für char*-Vergleiche stets strcmp() verwenden solltest.
-
Warum nimmst Du eigentlich so ein ellenlanges Array. Benutze in der DLL einfach einen AnsiString
AnsiString sCodeArray = "abcdefgh...";
So kannst Du Dir ne Menge Tipparbeit sparen und einfach auf jedes Element zugreifen.
AnsiString Test = sCodeArray[1]; //liefert 'a'
-
Immer wenn ich versuche strcmp zu nehmen, bekomme ich vom Compilier vorgeworfen: *Cannot convert 'int' to 'const char '.
Woran kann das denn schon wieder liegen???
-
Na, weil du wohl nen Int-Wert übergibst anstatt nem const char*.
-
Ich hab' das so gemacht, Funktioniert aber nicht:
if (strcmp(NormalText[a], Annalyt[y])==0) { //... }
Aber ich versteh nicht, was daran falsch ist???
[ Dieser Beitrag wurde am 03.03.2003 um 17:46 Uhr von aaaabyx editiert. ]