Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Aus DLL auf Prgramm zugreifen (https://www.delphipraxis.net/28662-aus-dll-auf-prgramm-zugreifen.html)

F.W. 28. Aug 2004 18:50

Re: Aus DLL auf Prgramm zugreifen
 
Ok, sorry!

Meine Anwendung und meine DLL haben 1 Form. Die Anwendung besteht aus einer Liste, in die alle DLLs gelesen werden, die sich im Ordner befinden.
Alle DLLs haben mindest. 2 Proceduren, GetInhalt und StartDLL.
Mit GetInhalt fragt die Anwendung beim Verzeichnischeck nach dem Inhalt der DLLs, quasi wie ein About, das die jeweilige DLL als String (PChar) zurückgibt.
Später kann man dann aus der Liste in der Anwendung eine DLL auswählen und sie wird mit StartDLL gestartet und läuft dann selbstständig (weil nicht Modal), bis sie oder die Andwendung beendet wird.

Das Prob: In der Liste wird ihr Handle gespeichert, dadurch kann sie von der Anwendung beendet werden. Wenn man jetzt aber am Formular der DLL Beenden anklickt, soll in der Liste das Handle zurückgesetzt werden (standartmäßig 0) und ein SubItem (Liste ist TListView) wird statt mit 'gestartet' mit 'nicht gestartet' o.ä. beschriftet.

:angel2:

Assarbad 28. Aug 2004 19:35

Re: Aus DLL auf Prgramm zugreifen
 
Aha, so langsam steige ich dahinter was du willst. Dann solltest du IMO folgendes machen.

StartDLL erzeugt ein Event/Mutex/... im Kontext der Anwendung und gibt das Handle zurück (StartDLL gibt also 1 Handle zurück). Dieses Event wird beim Entladen der DLL gepulst (PulseEvent()) und ein Thread (vorzugsweise der, der die DLl geladen hat) in der Hauptanwendung Wartet mit WaitForSingleObject() auf eben diesen Puls. Schon wissen beide Instanzen bescheid. Der wartende Thread kann dann dem Hauptform bescheidgeben, daß die DLL entladen ist und dieses kann den Status updaten.

Warum benutzt du aber eine eigene Func StartDLL() und nich direkt den Einsprungspunkt der DLL?

F.W. 28. Aug 2004 20:04

Re: Aus DLL auf Prgramm zugreifen
 
Ich habe mir über nichts gedanken gemacht, die Sachen, die du aufgezählt hast, sagen mir alle nicht viel.

Die Procedure StartDLL erzeugt nur die Form und zeigt sie an, danach kümmert sie sich. Es sollte quasi ein Starter werden, mit dem man die Sachen verwalten kann. Die DLLs waren zwar wie Plugins, liefen aber nach dem Start selbst ständig, ich könnte die StartDLL auch anders nennen...

Gibts da nicht noch was einfacheres?

Assarbad 28. Aug 2004 20:54

Re: Aus DLL auf Prgramm zugreifen
 
Es geht IMO nicht einfacher. Im Endeffekt müssen beide miteinander kommunizieren. Bei WMs hätte ich nur Bedenken, daß die nicht mehr abgesetzt werden, weil die DLL sich entlädt (ist aber nur eine Befürchtung). Versuch es halt mit WMs - wenn's nicht geht nimmste Mutexe o.ä.

F.W. 28. Aug 2004 23:34

Re: Aus DLL auf Prgramm zugreifen
 
Na gut, ic werd' mal sehen, tüfteln und ausprobieren! :coder2:

Assarbad 28. Aug 2004 23:59

Re: Aus DLL auf Prgramm zugreifen
 
Alternativ kannst du eine vereinfachte Version der Sourcen der DLL und der EXE hier reinstellen. Irgendjemand wird sich vermutlich erbarmen. Ab Montag auch ich wieder :-D

F.W. 29. Aug 2004 12:05

Re: Aus DLL auf Prgramm zugreifen
 
Nehmen wir mal ein vergleichbares einfacheres (aber sinnloses) Szenario: Die Anwendung hat ein TRichEdit und ein Editfeld.
Um den String aus dem Editfeld in das Richedit formatiert einzufügen ruft die Anwendung eine Procedure der DLL auf und übergibt ihr den String und irgendwas, (KEINE AHNUNG WAS!) damit die DLL Zuhriff auf das RichEdit der Anwendung hat.
Dann formatiert die DLL den String über das RichEdit und fügt ihn ein:
Delphi-Quellcode:
 TheRichEdit.SelAttributes.Color := clred;
 TheRichEdit.SelAttributes.Name := 'Courier New';
 TheRichEdit.SelAttributes.Size := 10;
 TheRichEdit.SelAttributes.Style := [fsBold];
 TheRichEdit.Lines.Add(S);
Wie das realisieren?

Danke!

Assarbad 29. Aug 2004 12:29

Re: Aus DLL auf Prgramm zugreifen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Siehe Anhang

Delphi-Quellcode:
// DLL-Code
function GetRichEditSetEdit(Rich:TRichEdit; Edit:TEdit):Boolean;
var
  s : String;
begin

  s := Edit.Text;

  Rich.SelAttributes.Color := clred;
  Rich.SelAttributes.Name := 'Courier New';
  Rich.SelAttributes.Size := 10;
  Rich.SelAttributes.Style := [fsBold];
  Rich.Lines.Add(S);

  Rich.Lines.Text := s;
end;
Delphi-Quellcode:
// EXE-Code
function GetRichEditSetEdit(Rich:TRichEdit; Edit:TEdit):Boolean;external 'Dingens.dll';

// TEdit == Pointer
// TRichEdit == Pointer
// Beide sind schließlich nur Instanzenpointer ... also kann man sie übergeben.
// Die aufgerufene Funktion muß nur über das Objekt bescheidwissen. Also immer
// DLL und EXE mit gleicher Delphi-Version kompilieren!!!

procedure TForm1.Button2Click(Sender: TObject);
begin
  GetRichEditSetEdit(RichEdit1, Edit1);
end;
Aber dieses Problem ist um einiges einfacher zu lösen als o.g. - oder???

Theoretisch kann man die Objektinstanzen auch typecasten - dazu verwendest du den AS-Operator

F.W. 29. Aug 2004 14:28

Re: Aus DLL auf Prgramm zugreifen
 
Endlich es funktioniert!!! :cheers: :witch: :dancer2: :hello:

Das reicht, damit sich die DLL selbst kümmert. Sie sucht jetzt im Listview nach ihrem Handle eintrag und setzt den Eintrag auf Gestoppt!
Den darum ging es mir ja! :warn:

F.W. 1. Okt 2004 21:20

Re: Aus DLL auf Prgramm zugreifen
 
Hallo nochmal!

:arrow: Ich überarbeite gerade ein Programm komplett. Und wollte die Variante mit der DLL benutzen, da dieser Teil oft in Updates drinstecken wird und da macht sich das mit DLLs einfach praktischer.

Dieses Mal ist es wie im Beispiel, ein RichEdit in den Text eingefügt werden soll. Aber der Text steht nicht in einem String, sondern in einem Stream.
Es wird also das RichEdit und der Stream übergeben (und das Hauptformular, weil geprüft wird, ob es sichtbar ist). Die DLL soll den String aus dem Stream lesen und ihn in das RichEdit einfügen, ans Formatieren denke ich momentan noch nicht.

Das Problem liegt jetzt darin, dass er nach der 1. zeile einfach aufhört die Anweisungen der Procedure abzuarbeiten:
Delphi-Quellcode:
(***************Ausschnitt aus der DLL***************)
  procedure GetMsg(RE: TRichEdit; MainForm: TForm; St: TStream); export; stdcall;

procedure GetMsg(RE: TRichEdit; MainForm: TForm; St: TStream);
var
 I: Integer;
 I64: Int64;
 Kennung: Char;
 S: String;
begin
 St.Seek(0, soFromBeginning); //<- Die Zeile macht er immer ohne Probleme
 St.ReadBuffer(Kennung, 1); //<- Diese Zeile macht er nicht mehr, aber er zeigt keinen Fehler an!
 if Kennung = 'T' then begin
    St.ReadBuffer(I, SizeOf(I));
    St.ReadBuffer(S[1], I);
    RE.Lines.Add(S);
    Melden(MainForm);

 end else if Kennung = 'C' then begin
    St.ReadBuffer(I, SizeOf(I));
  { ... }
 end else if Kennung = 'B' then begin
    St.ReadBuffer(I64, SizeOf(I64));
  { ... }
 end;
end;

//Und so wird alles aufgerufen:
(***************Ausschnitt aus dem programm***************)
  TGetMsg = procedure(RE: TRichEdit; MainForm: TForm; St: TStream);

  procedure GetMsg(RE: TRichEdit; MainForm: TForm; St: TStream); stdcall;

procedure GetMsg(RE: TRichEdit; MainForm: TForm; St: TStream);
var
 GM: TGetMsg;
 H: Cardinal;
begin
 if not FileExists(Main.Pfad+'DLL_Messaging.dll') then begin
    Beep;
    Exit;
 end;

 H := LoadLibrary(PChar(Main.Pfad+'DLL_Messaging.dll'));
 if H <> 0 then begin
    @GM := GetProcAddress(H, 'GetMsg');
    if @GM <> NIL then begin
       GM(RE, MainForm, St);
    end;
    FreeLibrary(H);
 end;
end;

procedure TMain.ServerExecute(AThread: TIdPeerThread);
var
 I: integer;
 St: TStream;
begin
 I := AThread.Connection.ReadInteger;
 if I > 0 then begin
    St := TMemoryStream.Create;
    try
      AThread.Connection.ReadStream(St, I);
      GetMsg(Main.RE, Main, St);
    finally
      St.Free;
    end;
 end;
end;
:warn: IMHO ist das wieder so ein Problem, wo man alles machen kann was man will, aber es nicht zum laufen bekommt, den ganzen Quelltext in ein neues Projekt kopieren... Würde nicht funktionieren. Nur wenn man sich eine Stunde hinsetzen würde und alles nochmal abtippen würde, dann würde wahrscheinlich alles gehn! :kotz:

Bitte helft mir, ich bin ratlos!


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:21 Uhr.
Seite 2 von 3     12 3      

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