![]() |
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 |
Re: Procedure einer DLL zur Laufzeit ändern
Delphi-Quellcode:
Wo ist das Problem? Bis auf die Tatsache, dass du wohl masochistisch veranlagt bist und dir deine eigene
if ergebnis_aus_dll = false
begin hLib := LoadLibrary(dll2); ... ![]() |
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! |
Re: Procedure einer DLL zur Laufzeit ändern
Warum nicht ersetzen?
|
Re: Procedure einer DLL zur Laufzeit ändern
oder eben ersetzen :-)
|
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.
|
Re: Procedure einer DLL zur Laufzeit ändern
jup das stimmt :-)
Ich habe aber noch eine kleine Frage zu dem Code:
Delphi-Quellcode:
//DLL
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.
Delphi-Quellcode:
Irgendwie ist mein @SummenFunktion immer Nil?!?!
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. Habe ich mir im Tutorial von Delphi-Source angeguckt. MFG Alex |
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.
|
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 14:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz