DLL einbinden...



  • 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 geschehen 😉 😉 😉

    Und 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. ]



  • Oh scheiße! Was hab ich für einen Mist geschrieben! Entschuldige bitte. Natürlich war deine allererste Abfrage richtig. Oh man, was ist nur heute mit mir los?! 😕 Sorry nochmal. Deine Abfrage war richtig, da du da keine char* 's vergleichst, sondern char's. Und das ist ja auch, was du wolltest. Ich schlage dir etwas vor: du strukturierst deinen Code so, dass man ihn auch gut lesen kann und ich schaue mir das dann an und versuche, die Fehlerquelle zu finden.



  • OK, das ist 'n Deal... 😉 😃 😉 😃

    @F98: Weil ich mich zwischen ' und " entscheiden muss: Eins kann ich nicht mit 'reinnehmen... Und ich entscheide mich für ". Es sei denn, du weißt 'n Weg, mit dem man beides mit reinkriegt...

    [ Dieser Beitrag wurde am 03.03.2003 um 18:04 Uhr von aaaabyx editiert. ]



  • F98 hat schon recht. Anstatt 1000 Zeilen für deinen char* AnalytInit (oder wie auch immer er heißt) zu schreiben, kannst du genauso

    char AnalytInit[] = " 0123456789ABCDEFG....";
    

    schreiben. Das ist das Gleiche!!!

    [ Dieser Beitrag wurde am 03.03.2003 um 18:10 Uhr von WebFritzi editiert. ]



  • Dann kann ich aber das " nicht verwenden, weil das Programm das als Ende des Strings ansieht... 😞 😞 😞

    Ach UND: Ich hatte es oben schon mal erwähnt: Wenn ich die Funktionen in dem Projekt, das ausgrführt wird, selbst deklariere, Funktionieren sie OHNE Fehlermeldung!!!



  • Ok, hier kommt der durchstrukturierte Code:

    //---------------------------------------------------------------------------
    #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");
    //---------------------------------------------------------------------------
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
    {
        return 1;
    }
    //---------------------------------------------------------------------------
    //Eingabe des Zeichenfeldes
    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]=' ';
    }
    //Codierungsfunktion
    String GetCodedText(String NormalTextIm, String PasswordIm)
    {
        AnnalytInit();
       //Initialisieren der Texte und des Passworts
        AnsiString NormalText=NormalTextIm;
        AnsiString Password=PasswordIm;
        AnsiString CodedText="";
       //Initialisieren der Variablen zum bestimmen des Zeichens im Text/Passwort
        int a=1;
        int b=1;
       //Codierung
        while (NormalText.Length()>CodedText.Length())
        {
        //Initialisierung der benötigten Variablen
            int y=1;
            bool Done=false;
          //Erkennung des Buchstabens im Text
            while((y<=103)&&(Done==false))
            {
            if (NormalText[a]==Annalyt[y])
                    Done=true;
            else
                    y++;
            }
          //Initialisierung der benötigten Variablen
            int z=1;
            Done=false;
          //Erkennung des Buchstabens im Passwort
            while((z<=103)&&(Done==false))
          {
            if (Password[b]==Annalyt[z])
                    Done=true;
            else
                    z++;
            }
          //Berechnung des Ergebnisses
            int e=y+z;
            if (e>103)
            e=e-103;
            CodedText=CodedText+Annalyt[e];
          //Bestimmen der neuen Variablenwerte für die Bestimmung eines Buchstabens im Text/Passwort
            a++;
            if (b==Password.Length())
            b=1;
            else
            b++;
        }
       //Endergebnis
        return CodedText;
    }
    //Funktion zum Decodieren
    String GetNormalText(String NCodedTextIm, String NPasswordIm)
    {
        AnnalytInit();
       //Initialisieren der Texte und des Passworts
        AnsiString NCodedText=NCodedTextIm;
        AnsiString NPassword=NPasswordIm;
        AnsiString BackNormalText="";
       //Initialisieren der Variablen zum bestimmen des Zeichens im Text/Passwort
        int g=1;
        int f=1;
       //Decodierung
        while (NCodedText.Length()>BackNormalText.Length())
        {
          //Initialisierung der benötigten Variablen
            int z1=1;
            bool Done2=false;
          //Erkennung des Buchstabens im Text
            while ((z1<103)&&(Done2==false))
            {
            if (NCodedText[g]==Annalyt[z1])
                    Done2=true;
            else
                    z1++;
            }
          //Initialisierung der benötigten Variablen
            int z2=1;
            Done2=false;
          //Erkennung des Buchstabens im Passwort
            while ((z2<=103)&&(Done2==false))
            {
            if (NPassword[f]==Annalyt[z2])
                    Done2=true;
            else
                    z2++;
            }
          //Berechnung des Ergebnisses
            int e2=z1+103-z2;
            if (e2>103)
            e2=e2-103;
            BackNormalText=BackNormalText+Annalyt[e2];
          //Bestimmen der neuen Variablenwerte für die Bestimmung eines Buchstabens im Text/Passwort
            g++;
            if (f==NPassword.Length())
            f=1;
            else
            f++;
       }
       //Endergebnis
        return BackNormalText;
    }
    

    Ich hoffe mal das wird gleich richtig dargestellt...
    Ja, SUPI...

    Was soll denn das jetzt...

    [ Dieser Beitrag wurde am 03.03.2003 um 19:04 Uhr von aaaabyx editiert. ]



  • Öhm, jo, das sieht doch schon viel besser aus. Aber sag mal, mit welcher MessageBox gibt es jetzt ein Problem?



  • Dieses Programm verstehe wer will... Früher hab' ich immer 'ne MessageBox gekriegt(beim Debuggen), wo drinstand:UNGÜLTIGE ZEIGEROPERATION... Wie gesagt... Früher... jetzt krieg ich immer, wenn ich die Funktion aufrufe, eine Zugriffsverletzung. Beim Debuggen und, wenn ich die EXE ausführe...

    [ Dieser Beitrag wurde am 03.03.2003 um 21:55 Uhr von aaaabyx editiert. ]



  • Die EXE? Die kann aber garnicht da sein, wenn ein Fehler im Programm ist. 😕 Und in WELCHER Funktion bekommst du eine Schmutzverletzung?



  • Also, nehmen wir mal an ich starte das Projekt, das die Funktionen aus der Dll aufruft, indem ich doppelt auf die vom Compilier erzeugte .exe-Datei klicke... Dann rufe ich eine der beiden Funktionen mit einer Button-Click-Methode auf.Jetzt krieg ich eine Zugriffsverletzung, egal welche Funktion ich verwendet habe... Diese kommt aber im weiteren verlauf des Programmes nie wieder vor. Die Funktionen arbeiten korrekt.

    EDIT: Sorry, ich meinte Zugriffsverletzung...

    [ Dieser Beitrag wurde am 03.03.2003 um 22:07 Uhr von aaaabyx editiert. ]


Anmelden zum Antworten