DLL einbinden...



  • Gibt's bei mir nicht... mag daran liegen, dass ich die Version 1.0 des Builders hab'... wie soll ich das hier machen???

    Ich hab' das so gemacht: Datei->Neu...(Dialogfeld)->DLL

    [ Dieser Beitrag wurde am 28.02.2003 um 17:22 Uhr von aaaabyx editiert. ]



  • Dann müßte es eigentlich geben diese lib.

    PS: Lies mein Thread oben nochmal, habe denn editiert...

    Wenn wirklich alle Stricke reißen, dann mach es dynamisch..

    Hier die erklärung: (Quelle: von F98)

    In der Klasse TForm1 (*.h) mußt du im "private"-Bereich, das einfügen:

    HINSTANCE DllInstance; // Instanz auf die DLL deklarieren
    

    In der *.cpp benutzt das so:

    if(!DllInstance)
      DllInstance = LoadLibrary("DllName.dll"); // DLL laden
    
    if(DllInstance)
      ShowMessage("DLL wurde geladen."); // Ist dafür das du sehen kannst ob die geladen ist. Aber entfernen, wenn es nicht mehr benötigt wird.
    
    // Funktionstyp deklarieren
    typedef int (__stdcall *IMPFUNC) (int, int);
    liefern
    IMPFUNC DllFunktion;
    int iSumme;
    if (DllInstance)
    {
      // Addresse der Funktion "Addieren" in der DLL herausfinden
      // Falls die Funktion nicht gefunden wird, einfach vor den
      // Funktionsnamen ein "_" setzen
      // Bsp.: statt "Addieren", "_Addieren" verwenden
      DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "_Addieren");
      // DLL-Funktion aufrufen,
      // An die DLL werden 2 int-Werte übergeben (aus Edit1 und Edit2)
      // Rückgabewert ist ein int-Wert (Summe)
      iSumme = DllFunktion(5, 15);
      ShowMessage(IntToStr(iSumme));
    }
    else
    {
      ShowMessage("Bitte DLL laden!");
    }
    
    if (DllInstance)
    {
      if (FreeLibrary(DllInstance))
      {
        DllInstance = NULL; // DLL entladen
      }
    }
    
    if (!DllInstance)
      ShowMessage("DLL entgeladen.");
    

    [ Dieser Beitrag wurde am 28.02.2003 um 17:37 Uhr von DJ BlackEagle editiert. ]



  • Hmmmmmmm..........
    Also die Einträge wie du sie in deinem vorletzten Beitrag beschreibst(Projekt->Optionen(Projekt Optionen)) gibt es bei mir so nicht...
    Weiterhin hab' ich schon 1000 mal versucht, das ganze neu zu compilieren, aber ohne Erfolg... Eine lib hab' ich nie bekommen... Kann es sein, dass der Bc++Builder die lib's nicht (automatisch) generiert...??? Kennt sich sonst noch jemand mit der Version aus?

    Und vielen Dank, DJ BlackEagle 😃 😃 😃

    AAAAAHHHHHHHHHHHHHHHH............... Ich bin langsam am Verzweifeln...

    [ Dieser Beitrag wurde am 28.02.2003 um 18:03 Uhr von aaaabyx editiert. ]



  • Wenn die dll kompeliert hast ohne Fehler. DAnn probiers mal mit meinem letzten Thread... DAs muß dann gehen...



  • Meinst du deinen letzten Beitrag(dynamisch laden)???



  • Jo.

    OT: Fahre jetzt nach Hause. KAnn dann erst nach 20 Uhr weiter helfen.



  • Das Beispiel da zum dynamisch laden ist mir zu spezifisch... Ich brauch 'n allgemeineres, damit ich weiß, wo ich was machen muss...
    Ist übrigens sehr nett von dir, DJ BlackEagle, dass du mir die ganze Zeit hilfst.



  • LIB generieren: "Projekt->Optionen->Linker->Importbibliothek erzeugen" anklicken.



  • Ach Fritzi... Wenn das unter Version 1.0 so einfach wäre...
    Das Menü Projekt->Optionen gibt's nicht...

    Aber:Ich hab' in der Hilfe das hier gefunden:

    Das Dienstprogramm IMPLIB erzeugt eine Importbibliothek. IMPLIB akzeptiert als Eingabe DLLs (dynamische Linkbibliotheken), Moduldefinitionsdateien oder beide und erzeugt eine Importbibliothek als Ausgabe.
    Beim Erzeugen einer Windows-Anwendung wird immer wenigstens eine Importbibliothek verwendet, und zwar IMPORT32.LIB, die Importbibliothek für die Standard-DLLs von Windows. (IMPORT.LIB wird automatisch gelinkt, wenn eine Windows-Anwendung in der Entwicklungsumgebung erzeugt und BCC32zum Linken verwendet wird. IMPORT32.LIB muß nur dann ausdrücklich gelinkt werden, wenn TLINK32 für ein gesondertes Linken benutzt wird.)

    Eine Importbibliothek verzeichnet einige oder alle der Exportfunktionen für eine oder mehrere DLLs. IMPLIB erzeugt Importbibliotheken direkt aus DLLs oder aus Moduldefinitionsdateien für DLLs (oder einer Kombination von beiden).

    Erzeugen einer Importbibliothek für eine DLL

    Optionen sind in Kleinschreibung anzugeben; ihnen ist entweder ein Binde- oder ein Schrägstrich voranzustellen.
    Syntax:

    IMPLIB Optionen BibName [ DefDateien... | DLLs... ] [@Response-Datei]

    Hier ist Optionen eine optionale Liste einer oder mehrerer IMPLIB-Optionen, BibName der Name für die neue Importbibliothek, DefDateien eine Liste einer oder mehrerer vorhandener Moduldefinitionsdateien für eine oder mehrere DLLs und DLLs eine Liste einer oder mehrerer existierender DLLs. Es muß zumindest eine DLL oder eine Moduldefinitionsdatei angegeben werden.
    Ebenso können Sie eine Response-Datei benutzen, die eine Liste der für Sie abzuarbeitenden .DEF- und .DLL-Dateien enthält. Eine Response-Datei ist eine ASCII-Textdatei, die eine Liste von Dateien enthält. Die Dateien müssen untereinander durch Leerzeichen oder Zeilenschaltung voneinander getrennt sein. Um eine Response-Datei in der Kommandozeile zu spezifizieren, müssen Sie dem Response-Dateinamen einen Klammeraffen (@) voranstellen. Beispielsweise,

    implib foo.lib @respon.txt

    Hinweis: Eine DLL kann außer .DLL auch die Dateinamenserweiterungen .EXE oder .DRV haben.

    Option Beschreibung

    -c Warnt bei Symbolen, für die Groß- oder Kleinschreibung vorgeschrieben ist.
    -f Importe nur über Namen zulassen.
    -i Weist IMPLIB an, WEP zu ignorieren, die Windows-Exit-Prozedur, die benötigt wird, um eine dynamische Linkbibliothek zu beenden. Diese Option ist zu verwenden, wenn mehr als eine Linkbibliothek in der Kommandozeile von IMPLIB angegeben wird.
    -o Erweiterung des Modulnamens nicht importieren (Nur 16-Bit Windows).
    -w Unterdrückt Warnungen.

    Copyright © 1997 Borland International.

    Aber ich weiß nicht genau wie ich das jetzt anwenden soll... Kann mir das jemand sagen???



  • Du mußt das auch mal lesen. und vergleichen.
    Hier nochmal anders erklärt:
    In der Klasse TForm1 (*.h) mußt du im "private"-Bereich, das einfügen:

    HINSTANCE DllInstance; // Instanz auf die DLL deklarieren
    

    In der *.cpp benutzt das so:

    if(!DllInstance)
      DllInstance = LoadLibrary("xxxxx"); // DLL laden (xxxxx durch den dll namen ersetzen)
    
    if(DllInstance)
      ShowMessage("DLL wurde geladen."); // Ist dafür das du sehen kannst ob die geladen ist. Aber entfernen, wenn es nicht mehr benötigt wird.
    
    // Funktionstyp deklarieren
    typedef int (__stdcall *IMPFUNC) (int, int);
    // Beispiel:
    // Die Funktion heißt:
    // bool checken(int value, char* value33)
    // dann müßtest du das zu :
    // typedef bool (__stdcall *IMPFUNC) (int,char*);
    // ändern.
    IMPFUNC DllFunktion;
    int iSumme;
    if (DllInstance)
    {
      // Addresse der Funktion "Addieren" in der DLL herausfinden
      // Falls die Funktion nicht gefunden wird, einfach vor den
      // Funktionsnamen ein "_" setzen
      // Bsp.: statt "Addieren", "_Addieren" verwenden
      DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "_Addieren"); // _Addieren das ist der Funktionsname (ohne _)
      // Beispiel:
      // Bei der checken funktion würde dann stehen:
      // DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "_checken");
      // DLL-Funktion aufrufen,
      // An die DLL werden 2 int-Werte übergeben (aus Edit1 und Edit2)
      // Rückgabewert ist ein int-Wert (Summe)
      iSumme = DllFunktion(5, "super");
      ShowMessage(IntToStr(iSumme));
    }
    else
    {
      ShowMessage("Bitte DLL laden!");
    }
    
    if (DllInstance)
    {
      if (FreeLibrary(DllInstance))
      {
        DllInstance = NULL; // DLL entladen
      }
    }
    
    if (!DllInstance)
      ShowMessage("DLL entgeladen.");
    

    [ Dieser Beitrag wurde am 28.02.2003 um 20:35 Uhr von DJ BlackEagle editiert. ]



  • Das ist so zu verstehen:

    implib foo.lib @respon.txt

    Wenn du eine DLL hast, die heißt super.dll

    Dann mußt du das im Quellcode so schreiben:

    implib wow.lib super.dll
    

    Wenn du aber viele dll´s hast, dann mußt du eine TextDatei erstellen.
    Du hast follgende dlls:
    super.dll,io.dll,was.dll,system.dll,form.dll

    Dann müßte das in der Text-Datei (Hat den namen importer.txt)
    super.dll
    io.dll
    was.dll
    system.dll
    form.dll

    DEr aufruf würde nicht mehr so lauten:

    implib wow.lib super.dll
    

    sondern so:

    implib wow.lib @importer.txt
    


  • @aaaaaaaabbxyz (oder wie du heißt): Versuch mal

    implib [Name der DLL].lib [Name der Dll].dll
    

    Das sollte es tun.



  • @webFritzi
    Wie er sagte, hat aus irgendwelchen Gründen keine LIB.

    Hier ist Optionen eine optionale Liste einer oder mehrerer IMPLIB-Optionen, BibName der Name für die neue Importbibliothek...



  • Original erstellt von DJ BlackEagle:
    Wie er sagte, hat aus irgendwelchen Gründen keine LIB.

    Eben, deshalb schrieb ich, wie er IMPLIB benutzen soll, um eine zu bekommen. Stehst wohl etwas auf dem Schlauch, wie? 😉

    [EDIT] *lol* Der, der auf dem Schlauch steht, bin wohl ich! 😃 Sorry, DJ, hatte deinen Beitrag völlig übersehen. [/EDIT]

    [ Dieser Beitrag wurde am 28.02.2003 um 21:47 Uhr von WebFritzi editiert. ]



  • Irgendwie klappt das mit implib nicht... ich bekomme immer einen Declaration Syntax Error, wenn ich das im Vereinbarungsteil mit einbaue, und drei andere, wenn ich das im normalen Quelltext mit einbaue... Wie soll ich das jetzt machen???
    Entschuldigung, wenn ich noch Anfänger bin...
    Das mit dem dynamischen einbinden: Ich verstand nicht, was iSumme da soll...

    Entschuldigt mich... 😕 😞 😉



  • Original erstellt von aaaabyx:
    Entschuldigung, wenn ich noch Anfänger bin...

    OK, aber auch nur das entschuldigt dich. 😉 Du musst die Zeile natürlich nicht im Quellcode einbauen! IMPLIB ist ein Kommandozeilen-Tool. Das heißt, dass du es in der Konsole (Eingabeaufforderung) im Prompt eingeben und dann auf Return drücken musst. Dabei solltest du dich in dem Verzeichnis befinden, in dem deine DLL steht.



  • Dankesehr an euch zwei... Das einbinden klappt, ich hab' 'ne Lib...
    Aber :

    Ich hab' in meiner DLL zwei Funktionen...Beide korrekt mit

    extern "C" __declspec(dllexport)
    

    exportiert... Ich hab' also die Lib zum Projekt hinzugefügt, die Funktionen mit

    extern "C" __declspec(dllimport)
    

    im Projekt importiert, und versucht sie zu benutzen...
    Bei der ersten geht dies ganz gut, ich krieg zwar eine "ungültige Zeigeroperation"(woran kann das liegen???), aber so viel macht das nicht aus... Die Funktion funktioniert... jetzt aber zur zweiten... Wenn ich den Aufruf der 2. Funktion versuche mitzucompilieren, krieg' ich 'nen Linker Fehler.:Undefined Symbol _GetNormalText referenced from ...[Pfad einer Projektdatei(ATest.obj)]...
    Hier ist der momentane Quelltext der Projektdatei, aus der ich die dll aufrufe:

    //---------------------------------------------------------------------------
    #include <vcl\vcl.h>
    #pragma hdrstop
    
    #include "ATest.h"
    //---------------------------------------------------------------------------
    #pragma resource "*.dfm"
    TForm1 *Form1;
    extern "C" __declspec(dllimport) String GetCodedText(String, String);
    extern "C" __declspec(dllimport) String GetNormalText(String, String);
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Edit1Click(TObject *Sender)
    {
     if (CheckBox1->Checked==true)
     {
      Label1->Caption=GetCodedText(Edit1->Text, "0");
     }
     else
     {
     // Label1->Caption=GetNormalText(Edit1->Text, "0");
     }
    }
    //---------------------------------------------------------------------------
    

    Könnt ihr mir irgendwie helfen???

    [ Dieser Beitrag wurde am 01.03.2003 um 16:14 Uhr von aaaabyx editiert. ]



  • Hast du dann auch die lib ins Projekt eingebunden?



  • Klaro... Das merkwürdige ist ja, dass eine Funktion richtig funktioniert(mit Fehlermeldung... 😡 😡 😡 ), die andere gar nicht...(Linker Fehler, siehe alles im letzten Beitrag...)

    ALSO: Wenn ich das

    // Label1->Caption=GetNormalText(Edit1->Text, "0");

    mitcompiliere, kriege ich einen Linker Fehler, hier

    Label1->Caption=GetCodedText(Edit1->Text, "0");

    funktioniert aber alles...

    [ Dieser Beitrag wurde am 02.03.2003 um 11:06 Uhr von aaaabyx editiert. ]



  • Haste im Import den Funktionsname richtig geschrieben, achtung case-sensetive.

    Und hast du in der dll das funktionsname im export reingeschrieben???


Anmelden zum Antworten