Gewuerzgurke - Fr 25.12.09 17:41
Titel: Formularfenster aus DLL - Probleme
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
http://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:
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' ;
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 - 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
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
Narses: Delphi-Tags hinzugefügt