Ich habe ein Problem, und ich habe versucht, eine Lösung zu suchen, kann aber nicht erreichen, was ich will. Tut mir leid, wenn das wirklich einfach ist, bitte zeigen Sie mir einfach, wie Sie es richtig machen.VCL/LCL - ein Formular in der DLL - keine Anwendung Taskleiste Fenster, kann das Hauptformular nicht minimieren
Also! Ich habe ein C-Programm, das ein Loader ist. Es muss meine DLL in Delphi oder Lazarus (Free Pascal) geschrieben aufrufen. Die DLL ist eigentlich eine Standalone-GUI-Anwendung: Während des Debuggens kompiliere ich sie bedingt als EXE und es funktioniert.
Mein Build-Skript kompiliert es als DLL mit einem Einstiegspunkt, der es ausführen muss, so wie es eigenständig funktioniert. Ich erwarte genau dasselbe Verhalten, aber ich kann bei Bedarf verschiedene Dinge tun (insbesondere das Anwendungssymbol einstellen).
Loader ist ein Konsolen-Stil-Programm, aber kompiliert ohne eine Konsole - keine Fenster, nichts. Es lädt nur DLL und ruft eine Funktion auf.
Problem ist, dass, wenn ich sogar leere Standard-Projekt mit einem Formular als EXE erstellen - es wird tatsächlich "Master" Anwendung (.Handle <> 0) Fenster in der Taskleiste haben. So kann ich seinen Titel unabhängig von der Hauptformularbeschreibung festlegen.
Aber wenn das gleiche in einer DLL ist - es gibt kein Anwendungsfenster (.Handle = 0), der Titel wird die Formularüberschrift sein, aber der wichtigste Fehler: ein Formular kann nicht minimiert werden!
In Delphi 7 geht es Hintergrund unter anderen Fenstern (aber Taskleiste bleibt!); in Lazarus minimiert es sich einfach ins Nirgendwo (verdeckt, keine Möglichkeit mehr zu restaurieren); beides ohne jegliche Minimierung der Animation.
Ansonsten scheint sich meine Anwendung normal zu verhalten. Das ist nur ein Problem, das ich habe.
OK, ich weiß, dass Formen in Bibliotheken ist eine schlechte Sache zu tun, aber: „eine andere“ VCL völlig unabhängig vom Host-Instanz zu instanziiert, vielleicht sogar in anderen Thread
Mir geht es gut.
Es gibt keine VCL in meiner bestimmten Host-Anwendung! Für mich muss es funktionieren genau so, wie es wird in EXE allein ...
Ich suchte etwas über Application.Handle in DLL, und jetzt verstehen, als ich einen Griff passieren müssen, um die Host-Anwendungsobjekt, so DLL wird mit anderen Host-Formen verbunden, aber ich habe keine! Es ist sogar nicht Delphi ... (und Anwendung: = TApplication.Create (nil); auch nicht half)
Alles, was von folgenden wird mir wahrscheinlich helfen:
A) Wie VCL anweisen, zu erstellen ein normales Anwendungsobjekt für mich? Wie kann es passieren, dass ich in EXE diesen Code kopieren kann?
B) Wie erstelle ich ein passendes Hauptfenster von C (richtige Stile, etc.), um es an DLL übergeben? Außerdem glaube ich, dass es in Free Pascal keinen direkten Zugriff auf den TApplication-Handle-Wert gibt, sodass ich ihn wahrscheinlich nicht zuordnen konnte.
C) Wie ohne ein Taskbar-Fenster zu leben, aber habe meine Form (gute Nachricht: mein Programm hat nur ein Formular!), Um richtig zu minimieren (oder nur irgendwie ...)?
ich Sie jetzt alle lieben einen Code, um zu sehen, so ist es hier:
// default empty project code, produces valid working EXE:
program Project1;
uses Forms, Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
+
// that's how I tried to put it in a DLL:
library Project1;
uses Forms, Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
function entry(a, b, c, d: Integer): Integer; stdcall;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
Result := 0;
end;
exports
entry;
begin
end.
I Funktion speziell gestaltete Eintrag() mit rundll32 aufrufbar zu sein, nur zum Testen.
Auch habe ich versucht, den Körper direkt auf "begin end.
" Initialisierung Abschnitt - das gleiche falsche Verhalten.
// To call a DLL, this can be used:
program Project1;
function entry(a, b, c, d: Integer): Integer; stdcall; external 'Project1.dll';
begin
entry(0, 0, 0, 0);
end.
Auch CMD-Befehl "rundll32 project1.dll entry
" wird es sofort ausgeführt werden. (Ja, so könnte ich einen Griff bekommen, den Rundll mir gibt, aber es ist sowieso nicht was ich will.)
Letzte Anmerkungen: (a) die DLL muss in Lazarus kompiliert werden; Eigentlich dachte ich zuerst, dass es ein Fehler in LCL ist, aber jetzt, wenn ich in Delphi7 getestet habe, sehe ich das gleiche; und da der Delphi-Fall einfacher und robuster ist, habe ich beschlossen, das hier zu machen; (b) Mein C-Loader ruft LoadLibrary nicht auf, er benutzt TFakeDLL-Hack (diese OBJ-Datei wurde optimiert, um ohne Delphi-Wrapper zu funktionieren) und lädt meine DLL aus dem Speicher (so habe ich kein Handle für DLL selbst), aber ansonsten Ihr Verhalten ist das gleiche.
Ich habe Formulare in Dlls in meiner D3-Zeit für gängige Dienstprogramme verwendet und bin auch in der Lage, unabhängig von einer ausführbaren Datei zu laufen, die eine einzige Zeile enthält, die Ihrer Konfiguration sehr ähnlich ist. Habe nicht mit der Anwendung oder irgendetwas getüftelt, nur ShowModal verwendet, um das Formular zu starten, das die erforderliche Nachrichtenschleife ausführt. Natürlich gibt es keine Modalität, da es keine anderen Formen gibt. Ich erinnere mich nicht an irgendwelche Komplikationen mit den Formen, sie haben einfach normal gehandelt. –
@ David Heffernan, hallo! (Erinnere dich an mich? ^^). Warum andere Tags entfernen? Ich denke zumindest "Delphi" ist notwendig, da dieses Problem auch in Delphi DLL einfach ist. Kann ich [Delphi] zurück hinzufügen? – aleksusklim
@Sertac Akyuz, danke! Ich habe meine eigene Antwort basierend auf Ihrer Lösung hinzugefügt. – aleksusklim