![]() |
Fenster einer DLL in den Vordergrund
Hallo zusammen!
Habe das Problem, dass ich aus meiner Applikation aus in einer bestimmten Routine eine DLL starte. In der Applikation ist ein weiteres Fenster geöffnet und wird somit als inaktives Fenster gekennzeichnet. Alles schön und gut. Jetzt wird in der DLL ein anderes Fenster geöffnet und hier ist das Problem. Das Fenster ist zwar aktiv, aber es läßt sich nicht mit den Befehlen "BringToFront()" oder "SetForeGroundWindow()" in den Vordergrund setzen. Ebenso ist das bei Messages die dann im Hintergrund sind. :wall: Ich hoffe mir kann da jemand weiterehelfen. Gruß, moony |
Re: Fenster einer DLL in den Vordergrund
poste bitte mal den code der dll wo das fenster erzeugt und angezeigt wird
|
Re: Fenster einer DLL in den Vordergrund
Die DLL wird statisch aus der Applikation aus aufgerufen und nach Rückgabe des Wertes direkt wieder freigegeben:
Delphi-Quellcode:
Das Fenster wird ja dann normal mit dem Laden der DLL erzeugt. Aufgerufen wird das Fenster hier:
function DLLLaden(dllname, functionname: String):Boolean;stdcall;export;
type Tcustfunction=function (var Names,Values:pchar):boolean;stdcall; var cfunction : tcustfunction; custhdl : Thandle; Func : TFarProc; begin ... custhdl := LoadLibrary(PChar(extractfilepath(application.exename) + dllname)); custfunc := GetProcAddress(custhdl,pchar(functionname)); if custfunc <> nil then begin @cfunction := custfunc; result:=true; end else begin result := false; FreeLibrary(custhdl); exit; end; result := cfunction(...,...); FreeLibrary(custhdl); ... end;
Delphi-Quellcode:
dann...
Procedure DLL.FormShow();
begin ... Fenster.ShowModal; if Fenster.ModalResult := mrCancel then Exit; ... end;
Delphi-Quellcode:
Ich hoffe das kann dir weiterhelfen. Das sind die wichtigsten Aufrufe.
Procedure Fenster.FormShow();
begin Fenster.BringToFront; end; gruß, moony |
Re: Fenster einer DLL in den Vordergrund
Nach meinem Wissensstand muss ich dich leider enttäuschen: So geht es nicht. Scheinbar liegt es daran, das das Eltern-Fenster sein "neues Kind" nicht als VCL-Fenster anerkennt und es deshalb auch nicht so behandelt. Du könntest eventuell versuche, das Kind-Fenster als Objekt zu übergeben und es von den Eltern erzeugen zu lassen (wie das in Natur ebenfalls gemacht wird :stupid: )
|
Re: Fenster einer DLL in den Vordergrund
Verstehe ich nich! :gruebel:
Es wird doch in der Applikation Fenster1 über ShowModal geöffnet. Während das Fenster1 gezeigt wird, wird von der Applikation eine DLL statisch geladen. In der DLL wird das Fenster2 als Übergang aufgerufen. In diesem Fenster2 wird ein weiteres Fenster3 aufgerufen. Das kann doch nicht so schwer sein die Fenster aus der DLL in den Vordergrund bringen zu können. Fenster1 hat ja überhaupt keine Ahnung davon dass es Fenster2 & Fenster3 gibt. |
Re: Fenster einer DLL in den Vordergrund
Vielleicht kann ich ja nur nicht richtig lesen, aber wo wird in dem Code denn überhaupt das Fenster erzeugt?
|
Re: Fenster einer DLL in den Vordergrund
Die Fenster von der Applikation werden beim Starten der Applikation unter
Delphi-Quellcode:
erstellt.
begin
... Applikation.CreateFrom(TFenster1, Fenster1); ... end. Die Fenster werden von der DLL unter
Delphi-Quellcode:
erstellt.
begin
... Applikation.CreateFrom(TFenster2, Fenster2); Applikation.CreateFrom(TFenster3, Fenster3); ... end. Also wird das Erstellen der Formen von der Applikation und DLL selbst übernommen. |
Re: Fenster einer DLL in den Vordergrund
Du schreibst, die DLL wäre statisch eingebunden. Trotzdem lädst du sie mit LoadLibrary und gibst sie sogar anschließend wieder frei. Eins von beidem geht doch aber nur.
Wo genau ist der Aufruf, der das Fenster anzeigen soll? Passiert das in irgendeiner Art und Weise in der cfunction? |
Re: Fenster einer DLL in den Vordergrund
Hallo Moony,
Du kannst deiner Funktion den Application Handle übergeben:
Delphi-Quellcode:
Der Aufruf aus der Anwendung sollte so aussehen:
type Tcustfunction=function (AHandle: THandle; var Names,Values:pchar):boolean;stdcall;
Delphi-Quellcode:
In der DLL die Funktion custfunction ändern:
result := cfunction(Application.Handle,...,...);
Delphi-Quellcode:
hoffe, das hilft dir weiter.
Application.Handle := AHandle;
Gruß, Ianis |
Re: Fenster einer DLL in den Vordergrund
Hast du es eigentlich schonmal mit Form2.Perform versucht? Ihm also quasi eine Message "vorgegaukelt"?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz