![]() |
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:
UsrIntThread.create startet dann
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;
Code:
Dann startet meine Anwendung zunächst unsichtbar. Dann wird sie von außen gesteuert über
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;
Delphi-Quellcode:
sichtbar gemacht.
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; .... Nur eben das saubere beenden. Kann mir jemand einen TIP geben ???? DANKE im Voraus |
Re: Anwendung von "außen"beenden
Delphi-Quellcode:
Da hat aber jemand kräftig Reverse-Engineering betrieben, wa? ;)
Application.Initialize;
Application.CreateForm(TF01Start, F01Start); Application.CreateForm(TF10Msge, F10Msge); Application.CreateForm(TF14Service, F14Service); Application.CreateForm(TF27End, F27End); Ansonsten: Keine VCL-Aktionen in Threads direkt ausführen, da diese nicht Thread-Safe sind. |
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 |
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.
|
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 |
Re: Anwendung von "außen"beenden
Hast du die GUI, welche die echte Hardware ansteuert selber geschrieben?
|
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 |
Re: Anwendung von "außen"beenden
Ich glaube dann (auf Grund des fremden Simulatorprogramms) fällt ActiveX aus.
|
Re: Anwendung von "außen"beenden
Ja,
glaube ich auch. Sonst irgendeine Idee von irgendjemand ???? Bin echt ratlos !!! :cry: |
Re: Anwendung von "außen"beenden
Und warum willst du die Anwendung nich einfach als eigenen Process starten (evtl ohne Create_New_console)?
|
Re: Anwendung von "außen"beenden
Hm,
ich weiß nicht recht, was Du meinst. Ich muss gewährleisten, dass meine GUI permanent Daten von der Simulator-GUI "empfängt", sie bearbeitet und graphisch anzeigt. Außerdem muss meine GUI auch permanent in der Lage sein, Daten an die Simulator-GUI zu "senden". Ich leite die ehemaligen RX- und TX-Puffer der seriellen Schnittstelle über eine Sende- und eine Empfangsprocedure zum Simulator. Wenn ich also meine Anwendung als eigenen Prozess starte, habe ich die Befürchtung, dass der Datenaustausch nicht so reibungslos funktioniert. Oder hab ich da jetzt was falsch verstanden ?? Grüße Bernd |
Re: Anwendung von "außen"beenden
Hallo an Alle,
bin mit meinem Problem etwas weiter. Ich glaube mein Problem ist das saubere Beenden des Thread, indem meine GUI läuft. Egal wie ich es anstelle, wenn ich nach dem Beenden meiner GUI mit X-SPY die laufenden Prozesse (ThreadID's) anschaue, sind auch nach Beendigung der GUI meine Formulare noch in der Liste. Egal, wie ich es anstelle. Der Aufruf von FreeAndNil(Thread) oder auch CloseHandle(ThreadID) endet in einer SpeicherExeption. Wie kriege ich nach Programmende meine im Thread erstellten Formulare wieder sauber aus dem Speicher ??? Grüße Bernd |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:48 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