Announcement

Collapse
No announcement yet.

Dynamisches Laden einer DLL ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dynamisches Laden einer DLL ?

    Wie kann man eine Dll, aus der diverse Functionen aufgerufen werden, dynamisch zur Laufzeit laden ohne das beim Programmstart
    nach dieser gesucht wird ? Bei uns kann der Fall auftreten das die DLL nicht vorhanden ist und so das Programm nicht startet.
    Die Unit in der die DLL benutzt wird ist mit diversen anderen Units verknüpft per uses.

    Bsp:Functionsaufrufe

    function SC_InitSocket: Integer; stdcall; external 'sockdllc.Dll';
    function SC_Connect(host: string; port: Integer): Integer; stdcall; external 'sockdllc.Dll';
    function SC_Disconnect(idServer: Integer): Integer; stdcall; external 'sockdllc.Dll';


  • #2
    Hallo,

    in meinem Buch <b>Delphi Win32-Lösungen</b> gehe ich ausführlich auf dieses Problem ein. Hier die Kurzfassung:

    1. Schritt: Prozedurale Typen deklarieren:
    <pre>
    type
    TSetDLLText = procedure(aTxt: PChar);
    TGetDLLText = function: PChar;
    </pre>
    2. Schritt: Variablen für die Funktionszeiger deklarieren
    <pre>
    var
    FSetDLLText : TSetDLLText;
    FGetDLLText : TGetDLLText;
    </pre>
    3. Schritt: DLL dynamisch laden und Funktionsadressen ermitteln
    <pre>
    procedure TFormMain.RGDLLClick(Sender: TObject);
    var
    dwError : DWord;
    begin
    if RGDLL.ItemIndex = 1 then begin
    // DLL laden
    if bDLL then Abort;
    hDLL := LoadLibrary('DLL_1.DLL');
    if hDLL <> 0 then begin
    @FSetDLLText := GetProcAddress(hDLL, 'SetDLLText');
    @FGetDLLText := GetProcAddress(hDLL, 'GetDLLText');
    if (Assigned(FSetDLLText) and
    Assigned(FGetDLLText)) then begin
    // Kein Fehler - also Button freigeben
    bDLL := True;
    BitBtnSet.Enabled := True;
    BitBtnGet.Enabled := True
    end
    else ShowMessage('DLL-Funktionen nicht gefunden !');
    end
    else begin
    // DLL-Ladefehler -> Fehlernummer anzeigen
    dwError := GetLastError;
    ShowMessage('Fehler: ' + IntToStr(dwError));
    end
    end
    else begin
    // DLL soll wieder freigegeben werden
    if bDLL then begin
    FreeLibrary(hDLL);
    FSetDLLText := nil;
    FGetDLLText := nil;
    bDLL := False;
    BitBtnSet.Enabled := False;
    BitBtnGet.Enabled := False
    end;
    end;
    end;
    </pre>
    4. Schritt: DLL-Funktionen aufrufen
    <pre>
    procedure TFormMain.BitBtnSetClick(Sender: TObject);
    begin
    StrCopy(szText, PChar(EditDLL.Text));
    FSetDLLText(szText);
    StatBar.SimpleText := 'DLL-Daten geschrieben'
    end;

    procedure TFormMain.BitBtnGetClick(Sender: TObject);
    begin
    StrCopy(szText,FGetDLLText);
    PanelDLL.Caption := szText;
    StatBar.SimpleText := 'DLL-Daten gelesen'
    end;
    </pre&gt

    Comment

    Working...
    X