Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Procedure einer DLL zur Laufzeit ändern (https://www.delphipraxis.net/66782-procedure-einer-dll-zur-laufzeit-aendern.html)

Alex_ITA01 4. Apr 2006 10:07


Procedure einer DLL zur Laufzeit ändern
 
Hallo erstmal,
ich hatte gestern schonmal angefangen mit dem Thema aber es war eine falsche Aussage von mir im Thread (RPC). Daher mache ich nochmal ein neues Thema auf und stelle die Frage richtig :-)
Ich habe in meiner Anwendung ein Aufruf, der zu einer Procedure in DLL_1 führt.
Nun erkennt ich, dass in der Procedure ein Fehler ist und da ich nicht immer die komplette Anwendung neustarten kann und will, sage ich dem Programm "irgendwie", dass es jetzt die gleiche Procedure (mit der einen kleinen Änderung) nicht mehr aus DLL_1 nehmen soll, sondern aus DLL_2...
Ich hoffe ihr wisst was ich meine...
Wäre schön wenn mir jemand sagen könnte, wie ich soetwas realisiere.
MFG Alex

Luckie 4. Apr 2006 10:13

Re: Procedure einer DLL zur Laufzeit ändern
 
Delphi-Quellcode:
if ergebnis_aus_dll = false
begin
  hLib := LoadLibrary(dll2);
  ...
Wo ist das Problem? Bis auf die Tatsache, dass du wohl masochistisch veranlagt bist und dir deine eigene DLL-Hell schaffst. Warum den Fehler nicht beheben und die gefixte DLL nutzen?

Alex_ITA01 4. Apr 2006 10:43

Re: Procedure einer DLL zur Laufzeit ändern
 
nur zur Info: Natürlich lösche ich danach die nicht mehr benötigte DLL_1 damit nicht wie Luckie denkt, eine DLL-Hölle entsteht...
Danke trotzdem!

Luckie 4. Apr 2006 11:04

Re: Procedure einer DLL zur Laufzeit ändern
 
Warum nicht ersetzen?

Alex_ITA01 4. Apr 2006 11:05

Re: Procedure einer DLL zur Laufzeit ändern
 
oder eben ersetzen :-)

Luckie 4. Apr 2006 11:07

Re: Procedure einer DLL zur Laufzeit ändern
 
Und dann wird es doch überflüssig zu prüfen, ob die Funktion korrekt gearbeitet hat in der DLL.

Alex_ITA01 4. Apr 2006 11:10

Re: Procedure einer DLL zur Laufzeit ändern
 
jup das stimmt :-)

Ich habe aber noch eine kleine Frage zu dem Code:

Delphi-Quellcode:
unit UnitDLL_Laden;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type TSummenFunktion = function(zahl1, zahl2: integer): integer; stdcall;

type
  TForm1 = class(TForm)
    BtnLade_Neu: TButton;
    edtErgebnis: TEdit;
    BtnRechne: TButton;
    OpenDialog_DLL_Org: TOpenDialog;
    BtnOeffnen_Org_Org: TButton;
    BtnOeffnen_Neu: TButton;
    OpenDialog_DLL_Neu: TOpenDialog;
    BtnLade_Org: TButton;
    Update_Timer: TTimer;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    LibHandle: THandle;
  public
    { Public-Deklarationen }
  end;
{---------------------------------------------------------------------------}
var
  Form1: TForm1;
{---------------------------------------------------------------------------}
implementation
{---------------------------------------------------------------------------}
{$R *.dfm}
{---------------------------------------------------------------------------}
procedure TForm1.FormCreate(Sender: TObject);
var
  SummenFunktion : TSummenFunktion;
  DLL_Name      : String;
begin
  DLL_Name := 'DLL_Projekt.dll';

  LibHandle := LoadLibrary(PChar(DLL_Name));

  if Handle <> 0 then
  begin
    @SummenFunktion := GetProcAddress(Handle, 'addiere');
    if @SummenFunktion <> nil then
    begin
      edtErgebnis.Text := IntToStr(SummenFunktion(10, 20));
    end;
  end;
end;
{---------------------------------------------------------------------------}
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeLibrary(LibHandle); // Free Memory Allocated for the DLL
end;
{---------------------------------------------------------------------------}
end.
//DLL
Delphi-Quellcode:
library DLL_Projekt;

{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss sich in der
  ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt-
  Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die
  Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle
  Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die
  sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur
  Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL.
  Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String-
  Informationen als PChar- oder ShortString-Parameter übergeben. }
 

uses
  SysUtils,
  Classes;

{$R *.res}

function addiere(zahl1, zahl2: integer): integer; stdcall;
begin
  result := zahl1 + zahl2;
end;

exports addiere;

end.
Irgendwie ist mein @SummenFunktion immer Nil?!?!
Habe ich mir im Tutorial von Delphi-Source angeguckt.
MFG Alex

Luckie 4. Apr 2006 11:23

Re: Procedure einer DLL zur Laufzeit ändern
 
Äh, guck dir mal deine Code genauer an. Das Handle der DLL legst du in der Variablen LibHandle ab (wo auch immer die deklariert ist, warum nicht lokal?). Aber bei GetProcAddress benutzt du das Handle deiner Form: Handle. Das dort die Funktion nicht gefunden wird, dürfte klar sein.

Alex_ITA01 4. Apr 2006 11:27

Re: Procedure einer DLL zur Laufzeit ändern
 
Sh... Ups...
Habe ich auch gerade gesehen.
Trotzdem Danke Luckie...
MFG Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz