Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Anwendung von "außen"beenden (https://www.delphipraxis.net/129280-anwendung-von-aussen-beenden.html)

bmontag 16. Feb 2009 11:47


Anwendung von "außen"beenden
 
Erstmal von mir als Neuling in diesem Forum ein HALLO an Alle.

Jetzt zu meinem Problem, mit dem ich mich seit einigen Tagen herumschlage. Ich habe aus einer bereits bestehenden Anwendung eine dll gebaut. Diese dll kann ich aus einer DELPHI- oder C++ Anwendung heraus als Thread starten. Dazu habe ich die bestehende Anwendung um eine UNIT erweitert, die mir als Parametrierplattform dient. Das funzt auch soweit gut. Ich habe ein Problem beim Beenden meiner in der dll "gekapselten" Anwendung.
Wenn ich meine Anwendung über den "normalen Weg" beende - das Programm hat oben rechts kein "rotes Kreuz" - läuft allse prima. Nur der Weg von "außen" funktioniert nicht. Ich dachte ich "drücke" aus der übergeordneten Anwendung einfach die Tasten, mit denen ich die Anwendung normal beende aber PUSTEKUCHEN. Das Ende ist immer eine Exeption
"Fehler beim Erstellen des Fenster-Gerätekontext". Und ich finds einfach nicht :wall:
Im Klartext: die übergeordnete Anwendung initialisiert die gekapselte Anwendung in der dll über

Code:
procedure eyesiMPInitialize(pos_x,pos_y:integer; MachineDir : PAnsiChar);stdcall;
begin
  eyesiLock := TCriticalSection.Create;
  UsrIntThread:= TUsrIntThread.create(false);
  UsrIntThread.position_x:=pos_x;
  UsrIntThread.position_y:=pos_y;
  UsrIntThread.Resume;
end;
UsrIntThread.create startet dann

Code:
procedure TUsrIntThread.execute;
begin
  Application.Initialize;
  Application.CreateForm(TF01Start, F01Start);
  Application.CreateForm(TF10Msge, F10Msge);
  Application.CreateForm(TF14Service, F14Service);
  Application.CreateForm(TF27End, F27End);
   .
   .
  Application.ShowMainForm := false;[delphi]
  Application.Run;
Dann startet meine Anwendung zunächst unsichtbar. Dann wird sie von außen gesteuert über

Delphi-Quellcode:
procedure eyesiMPStart;stdcall;
begin
  UsrIntThread.StartForm := 13;            // EYESI-Startformular setzen
  UsrIntThread.eyesi_Operateur := 1;
  UsrIntThread.eyesi_Operation := 1;
  UsrIntThread.eyesi_OPSchritt := 1;
  SerKomWin.EyesiClickFunktionen(2);
end;
sichtbar gemacht.

.... Nur eben das saubere beenden. Kann mir jemand einen TIP geben ????

DANKE im Voraus

nuclearping 16. Feb 2009 14:19

Re: Anwendung von "außen"beenden
 
Delphi-Quellcode:
Application.Initialize;
Application.CreateForm(TF01Start, F01Start);
Application.CreateForm(TF10Msge, F10Msge);
Application.CreateForm(TF14Service, F14Service);
Application.CreateForm(TF27End, F27End);
Da hat aber jemand kräftig Reverse-Engineering betrieben, wa? ;)

Ansonsten: Keine VCL-Aktionen in Threads direkt ausführen, da diese nicht Thread-Safe sind.

bmontag 16. Feb 2009 15:38

Re: Anwendung von "außen"beenden
 
Hallo und erst mal vielen Dank für die Antwort.

Ne, Zweck der Übung ist es, ein und dieselbe GUI entweder auf einer realen Maschine oder in einer Simulator-Umgebung laufen zu lassen. Es ist nicht alles gleich Reverse Eng.
Aber mal zum Thema: Ja ich weiss, keine VCL-Aktivitäten in Threads... aber wie sonst ? Ich kann den create in eine eigene Funktion packen und mit synchronize aufrufen ?? Aber ich sehe den Zusammenhang mit meinem Problem nicht... Zudem habe ich alle "globalen" Variablen, die den Datenaustausch zwischen den beiden "Welten" regeln durch CRITICAL SECTIONS gesichert.

Grüße

Bernd

himitsu 16. Feb 2009 15:43

Re: Anwendung von "außen"beenden
 
noar, wenn er alles (samt der Nachrichtenschleife) in dem gleichen Thread laufen läßt, dann könnte es eventuell gehn.

bmontag 16. Feb 2009 16:47

Re: Anwendung von "außen"beenden
 
Hallo zusammen,

eventuell bin ich ja mit meinem Lösungsansatz auf dem Holzweg. Also.. ich habe eine GUI, die über serielle Schnittstelle mit einer Steuerhardware kommuniziert. Die gleiche GUI soll in einer Simulationsanwendung als dll laufen und von einem C-Programm so angesteuert werden, als ob die Steuerhardware vorhanden wäre. Also war mein Lösungsansatz... die GUI als dll verpacken und als Thread vom C-Programm ansteuern lassen. Eventuell gibt es ja für mein Problem auch einen anderen Lösungsansatz, den ich bisher nicht gefunden habe.

Grüße

Bernd

sirius 16. Feb 2009 16:55

Re: Anwendung von "außen"beenden
 
Hast du die GUI, welche die echte Hardware ansteuert selber geschrieben?

bmontag 16. Feb 2009 17:44

Re: Anwendung von "außen"beenden
 
Ja,

aus diesem Grund ja die Idee, den Sourcecode zu nehmen, ne dll daraus zu bauen und als parallelen Thread aus dem Simulatorprogramm heraus aufzurufen. Der Vollständigkeit halber sei erwähnt, dass das Simulator-Programm nicht von mir ist. Ich habe mir ein Delphi Programm geschrieben, das mir die Funktionsaufrufe des Simulators nachbildet. Die Definition der Schnittstelle zwischen Sim und meiner GUI ist aber auch von mir. Ich liefere dem SIM-Progi meine dll.

Grüße

Bernd

sirius 16. Feb 2009 18:31

Re: Anwendung von "außen"beenden
 
Ich glaube dann (auf Grund des fremden Simulatorprogramms) fällt ActiveX aus.

bmontag 16. Feb 2009 18:33

Re: Anwendung von "außen"beenden
 
Ja,

glaube ich auch. Sonst irgendeine Idee von irgendjemand ???? Bin echt ratlos !!! :cry:

sirius 16. Feb 2009 18:48

Re: Anwendung von "außen"beenden
 
Und warum willst du die Anwendung nich einfach als eigenen Process starten (evtl ohne Create_New_console)?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:30 Uhr.
Seite 1 von 2  1 2      

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