Hallo Community,
Ich sitz hier vor einem Problem, wo ich am verzweifeln bin.
Wir haben eine Anwendung, die auf 100PCs läuft. Um die Anwendung im laufenden Betrieb upgraden zu können, haben wir ein Plugin-System entwickelt (
DLL). Klar, hätte auch
BPL sein können. Aber es ist nun einmal
DLL.
Wenn wir eine
DLL upgraden wollen, kopieren wir die neue
DLL mit der Endung 'NEW' ins Plugin-Verzeichnis, der Pluginmanager bekommt davon wind, terminiert das Plugin, schmeisst es weg, benennt die 'NEW'-Datei um und lädt das Plugin wieder.
Ziemlich cool, das Ganze.
Leider müssen wir nun ein Messagingservice implementieren. Dabei soll an bestimmten PC unter bestimmten Umständen eine Message angezeigt werdne. Der Anwender kann nun Buttons drücken und fertig. Die Nachricht wird über
TCP verschickt.
Ach ja, wenn der Anwender die message ignoriert, soll über
TCP auch ein 'HIDE' verschickt werden können.
Ich dachte mir, schreib ein Plugin, schmeiss einen TIdTCPServer rauf, OnExecute-Ereignis definieren, eingehende Nachricht parsen, Formular befüllen, anzeigen (oder verbergen), fertig.
Klappt irgendwie nicht. ich zeige das formular mit 'Show' an. Dann sieht man es kurz. Und danach geht dann gar nix mehr.
Gleicher Aufbau, nur das das Fenster nicht in der OnExecute-Methode angezeigt wird, sondern von der Hauptanwendung, funktioniert:
Delphi-Quellcode:
library formdll;
uses
SysUtils,
Classes,
Forms,
dllform in 'dllform.pas' {Form33};
{$R *.res}
Procedure ShowSample (AppHandle : THandle); stdcall;
begin
// Verstehe nicht, was das soll... Habs aus dem Internet und funzt.
Application.Handle := AppHandle;
TForm1.Create(Application).Show;
end;
exports
ShowSample;
end.
//---------------------------------------
// Calling App
Procedure ShowSample (AppHandle : THandle); stdcall; external 'formdll.dll';
procedure TForm34.btClick(Sender: TObject);
begin
ShowSample(Application.Handle);
end;
Kann man ein Formular aus der OnExecute-Methode in einer
DLL heraus aufrufen, oder nicht? Wenn ja, wie geht das? Was muss ich beachten?
Ach so: Dem TidTCPServer habe ich auch schon das Application-Objekt als Owner beim Instantiieren übergeben... Scheint aber nicht zu funktionieren.
Ich hab außerdem den Eindruck, das meine "Lösung", also Formular aus OnExecute aus anzeigen, dazü führt, das Windows hinterher total durcheinander kommt. Wenn ich nämlich mal suche, wieso das Fenster nicht mehr angezeigt wird, knallt mir Delphi weg, wenn ich auf einen Canvas in der
DLL zugreifen will.
Neustart Delphi bringt nix.
Neustart Windows schon.... Kurzzeitig.
Ach ja: Delphi 2007
Wäre auch nett, wenn mir jemand erklären könnte, wieso es NICHT geht. Denn meine Alternative ist, den MessagePopuphandler als EXE zu schreiben (TrayIcon)...