Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Autoerstellung einer Form beim Laden einer DLL (https://www.delphipraxis.net/162915-autoerstellung-einer-form-beim-laden-einer-dll.html)

Memnarch 9. Sep 2011 12:32

Autoerstellung einer Form beim Laden einer DLL
 
Tag allerseits,
Ich habe ne dll, wenn die geladen wird, soll automatisch eine Form erstellt und angezeigt werden(egal ob es mein programm gewollt hätte oder nicht). Man stelle sich z.B. ne LogConsole vor die geladen wird und sich selbst automatisch anzeigt.(JA ich will es automatisch)

Irgend wann vor anotuk hab ich das mal hinbekommen, aber jetzt weiß ich nicht mehr wie v.v.

Mein problem:

Ich erstelle meine Form, sag ihr sie soll sich anzeigen, und das tut sie auch. Aber nur für wenige ms. Dann verschwindet sie sofort wieder.

Zum test hab ich einen Dialog nach dem ShowAufruf meiner form plaziert. Jetzt bleibt die form solange sichtbar bis der dialog geschlossen wird.

Woran liegt dass?

PS: Ja ich kann bei mir in der DLL Application nutzen.

MFG
Memnarch

chaosben 9. Sep 2011 12:36

AW: Autoerstellung einer Form beim Laden einer DLL
 
Ich habs grad mal getestet:
DLL:
Delphi-Quellcode:
uses
  SysUtils,
  Classes,
  Unit66 in 'Unit66.pas' {Form66};

{$R *.res}

begin
  TForm66.Create(nil).Show;
end.
Programm:
Delphi-Quellcode:
procedure TForm67.FormCreate(Sender: TObject);
begin
  LoadLibrary('project37.dll');
end;
Funzt super. Das Formular bleibt bestehen.

Memnarch 9. Sep 2011 12:39

AW: Autoerstellung einer Form beim Laden einer DLL
 
Mh, dann liegtes vllt daran dass ich versuche das ding ber DLL injection in mein programm zu werfen o.O(JA schlagt mich, das hatte ich oben nicht erwähnt, thsculdigung :oops:)

himitsu 9. Sep 2011 12:47

AW: Autoerstellung einer Form beim Laden einer DLL
 
Versuch alles in einem eigenen Thread su machen. DLL+VCL laden und die Form erstellen.
Außerdem braucht dieser Thread noch eine Message-Loop (Application.ProcessMessages aufrufen), denn irgendwo müssen die VCL/Window-Messages ja verarbeitet werden.

Wenn das Hauptprogramm auch eine VCL besitzt, dann kommen sie sich sonst womöglich in die Quere.

Oder eben alles NonVCL erledigen, aber die NonVCL-Form im Hauptthread der Anwendung erstellen, ansonsten ebenfalls eine Message-Loop im erstellenden Thread.



Messages sind threadabhängig ... abhängig vom Thread, in welchem ein Win-Control erstellt wurde.

Memnarch 9. Sep 2011 13:06

AW: Autoerstellung einer Form beim Laden einer DLL
 
Wie mach ich den eine NonVCL Form o.O?

Und nach dem inject sollte meine DLL im selben thread laufen, oder nicht?

himitsu 9. Sep 2011 13:13

AW: Autoerstellung einer Form beim Laden einer DLL
 
Ausgeführte Funktionen laufen immer in dem Thread, von wo sie getartet wurden.
DLL und Initialization laufen in dem Thread, welcher die DLL läd.

MSDN-Library durchsuchenCreateWindow? (einfacvh mal bei Luckie auf der Webseite umschauen)

PS: mein FileSplitter ist auch NonVCL, allerdings verwendet er für die "Forms" Dialoge, welche aus einer vorgefertigten Ressource geladen werden.
Bei Luckie (und Hier im Forum suchenNonVCL) findest du vorwiegend Beispiele, wie man eine Form zur Laufzeit zusammenbaut/erstellt.

FredlFesl 9. Sep 2011 14:41

AW: Autoerstellung einer Form beim Laden einer DLL
 
Ich hatte mal das Problem, als ich in der Form, die in der DLL angezeigt wird, einen TIdTCPServer hatte und in dessen Execute-Methode (ich Idiot) auf die Form zugegriffen habe.

Nachdem ich alles auf Messages umgestellt hatte, funktionierte es super.

Nachdem ich damals aus dem Koma erwacht bin, in das ich fiel, als ich :wall: (weil es nicht funktionierte), hab ich mit einer DLL angefangen, die nur ein Formular anzeigt und dann stückweise die Funktionalität hinzugefügt. Na ja, dann war mir klar woher der Wind weht.

Die DLL ist heute als Plugin im Einsatz, das eine Messagebox hochpoppen lässt und eine Nachricht anzeigt, die per TCP verschickt wurde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:58 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