AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Aus DLL auf Prgramm zugreifen

Ein Thema von F.W. · begonnen am 27. Aug 2004 · letzter Beitrag vom 22. Okt 2006
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#11

Re: Aus DLL auf Prgramm zugreifen

  Alt 28. Aug 2004, 18:50
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.

  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#12

Re: Aus DLL auf Prgramm zugreifen

  Alt 28. Aug 2004, 19:35
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?
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#13

Re: Aus DLL auf Prgramm zugreifen

  Alt 28. Aug 2004, 20:04
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?
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#14

Re: Aus DLL auf Prgramm zugreifen

  Alt 28. Aug 2004, 20:54
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.ä.
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#15

Re: Aus DLL auf Prgramm zugreifen

  Alt 28. Aug 2004, 23:34
Na gut, ic werd' mal sehen, tüfteln und ausprobieren!
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#16

Re: Aus DLL auf Prgramm zugreifen

  Alt 28. Aug 2004, 23:59
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
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#17

Re: Aus DLL auf Prgramm zugreifen

  Alt 29. Aug 2004, 12:05
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!
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#18

Re: Aus DLL auf Prgramm zugreifen

  Alt 29. Aug 2004, 12:29
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
Angehängte Dateien
Dateityp: zip 2_168.zip (2,5 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#19

Re: Aus DLL auf Prgramm zugreifen

  Alt 29. Aug 2004, 14:28
Endlich es funktioniert!!!

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!
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#20

Re: Aus DLL auf Prgramm zugreifen

  Alt 1. Okt 2004, 21:20
Hallo nochmal!

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 = 'Tthen begin
    St.ReadBuffer(I, SizeOf(I));
    St.ReadBuffer(S[1], I);
    RE.Lines.Add(S);
    Melden(MainForm);

 end else if Kennung = 'Cthen begin
    St.ReadBuffer(I, SizeOf(I));
  { ... }
 end else if Kennung = 'Bthen 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;
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!

Bitte helft mir, ich bin ratlos!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:28 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