![]() |
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)?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 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 by Thomas Breitkreuz