Autor Beitrag
Gewuerzgurke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 152

Win XP
Lazarus
BeitragVerfasst: Fr 25.12.09 17:41 
Hallo, ich versuche seit Tagen vergeblich ein Anzeigefenster aus einer DLL heraus zu erzeugen. Als erstes hatte ich CreateWindowEx (so wie in PurboPASCALs TemplateScreenSaver hier www.delphi-forum.de/viewtopic.php?t=91607) versucht - ging nicht. Dann habe ich ein Formular in der DLL erstellt. Der Code ist dem einer Anwendung jetzt sehr ähnlich:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
library FensterErstellen;

uses
  Forms, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  Dialogs,
  Unit1 in 'Unit1.pas' {Form1};

procedure Create;
begin
 Showmessage('hy');
end;

exports Create;

begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 SendMessage(Form1.Handle,WM_CLOSE,0,0);
end.


Dadurch erhalte ich ein Fenster, dass aber sofort wieder zu geht (Und mit diesem auch das Programm, dass die DLL (dynamisch) geladen hat :bawling: ).

Naja - mit Application.Run bleibt das Fenster offen aber das Programm, das die DLL geladen hat hängt solange das Fenster offen ist. Eigentlich wird das Fenster zweimal geöffnet. Wenn ich es schließe, ist es sofort wieder da (Solange hängt die Host-Anwendung komplett). Dann (nachdem ich es also mit SendMessage(Form1.Handle,WM_CLOSE,0,0); geschlossen habe) läuft die Host-Anwendung teilweise weiter, verarbeitet Messages, aber die Procedure Create kann immer noch nicht gestartet werden :( .

Ich habe gedacht, wenn ich das Application.CreateForm, und so, mit in diese Procedure schreibe, würde es gehen aber dann erhalte ich den Fehler "Unbekannte Direktive: Application".

Wer kennt sich damit aus?
Wie kann ich aus der DLL heraus ein Zweitfenster öffnen ohne dass die Host-Anwendung hängt?
JDKDelphi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 115
Erhaltene Danke: 22

WIN2000, XP, WIN 7 , UNIX, LINUX
Assembler für (Z8x, 68xxx,R6000,Intel), DELPHI 6 Enterprise, MAGIC eDeveloper V9+V10, C++, C#,VB, .NET, zertifizierter iBOLT-Programmierer
BeitragVerfasst: Fr 25.12.09 18:05 
Fenster aus DLL

Hallo,

das kann so eigentlich nicht funkionieren.

Ich mach das meist so:

Normale Unit mit der Form erzeugen und durchprogrammieren.

In der DLL habe ich dann mindestens drei Funktionen, die ich exportiere.. Etwa so
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
Library myDLL;

uses myunitformx,  +  ... andere Units...;

PROCEDURE CreateWindow; 
BEGIN
  IF NOT(assigned(myUnitForm)) THEN
    myunitform.create := tform.create;
  
END;

PROCEDURE ReleaseWindow;
BEGIN
  IF assigned(myUnitForm) THEN myunitform.free;
  myunitform := NIL;
END;

PROCEDURE ShowWindow;
BEGIN
 IF assigned(myUnitForm) THEN  myunitform.Showmodal; 
END;

exports
  CreateWIndow,
  ReleaseWindow,
  ShowWindow;

Die Form zeige ich modal an, damit das Fenster im Vordergrund bleibt, sonst müsste man sich das Fensterhandle speichern.

Probier das mal

Gruss

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt

_________________
Wo andere aufhören, fange ich erst an..
Gewuerzgurke Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 152

Win XP
Lazarus
BeitragVerfasst: Fr 25.12.09 18:26 
So ähnlich hatte ich das auch schon versucht aber TForm.Create erwartet Parameter... eine TComponent...
Wie hast du das bei dir gemacht? Ist myunitform etwa keine TForm?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 25.12.09 19:46 
user profile iconGewuerzgurke hat folgendes geschrieben Zum zitierten Posting springen:
So ähnlich hatte ich das auch schon versucht aber TForm.Create erwartet Parameter... eine TComponent...
Genau, zum Beispiel nil...
Gewuerzgurke Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 152

Win XP
Lazarus
BeitragVerfasst: Fr 25.12.09 20:09 
Oh toll, nil geht!
Es war mal wieder so einfach! Und ich kann das Formular auch in der DLL bearbeiten (uses Unit1 in 'Unit1.pas' {Form1}).

Vielen Dank euch beiden :)