AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Nichtmodale Form aus DLL anzeigen

Ein Thema von Iwo Asnet · begonnen am 11. Jun 2011 · letzter Beitrag vom 12. Jun 2011
Antwort Antwort
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#1

Nichtmodale Form aus DLL anzeigen

  Alt 11. Jun 2011, 18:00
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)...
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Nichtmodale Form aus DLL anzeigen

  Alt 11. Jun 2011, 19:48
Versuch doch mal mit Synchronize im OnExecute zu arbeiten.
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#3

AW: Nichtmodale Form aus DLL anzeigen

  Alt 12. Jun 2011, 05:14
Hallo,

Synchronize ist eine Methode der TThread-Klasse. Nur hab ich hier keinen Thread...
Vom TIdTCPServer bekomme ich im OnExecute nur ein TIdContext-Objekt übergeben.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Nichtmodale Form aus DLL anzeigen

  Alt 12. Jun 2011, 05:20
Binde mal die Unit IdSync ein, dann geht folgendes...

Delphi-Quellcode:
procedure TForm.IdTCPServerExecute(AContext: TIdContext);
begin
  TIdSync.SynchronizeMethod(...);
end;
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#5

AW: Nichtmodale Form aus DLL anzeigen

  Alt 12. Jun 2011, 07:21
Ah, das probier ich mal.

Mittlerweile habe ich mir einen Umweg ausgedacht: Im OnExecute definiere ich nur, DAS das Fenster angezeigt wird.
Gottseidank habe ich eine Polling-Funktion in jedem Plugin, die periodisch 2x Sekunde vom Host aufgerufen wird.
Hier setze ich dann visible auf FALSE/TRUE.

Das funktioniert.

Aber trotzdem werde deine Idee das mal testen......

... Nee.. da passiert rein gar nichts. Es wird noch nicht einmal die zu synchronisierende Methode aufgerufen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz