Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Comport sperren? (https://www.delphipraxis.net/73668-comport-sperren.html)

Privateer3000 21. Jul 2006 14:29


Comport sperren?
 
Hi folks,

Wie stellt man das an, wenn man einen Comport sperren
möchte das da kein Signal ankommt oder ins nirvana umgeleitet wird.
Sinn und Zweck ist, am Comport ist ein Interface für eine Steuerung
angeschlossen. Es sollte aber möglich gemacht werden,dass selbst wenn
normalerweise ein chr an den Port gesendet wird, diesen abzufangen.
Per button vielleicht...aber auch wieder den Port einschalten.
Ich benutze die CPortLib von Sourceforge.

Ich hoffe ungefähr richtig formuliert zu haben , was ich möchte ;-)

Lg
Privateer

Der_Unwissende 21. Jul 2006 14:35

Re: Comport sperren?
 
HI,
kannst du bitte etwas genauer sagen was du möchtest? Möchtest du aus deiner Anwendung nur bei Bedarf auf den Port zugreifen oder möchtest du, dass der Port unter Windows für jedes Programm nicht zugänglich ist?

Gruß Der Unwissende

Privateer3000 21. Jul 2006 14:41

Re: Comport sperren?
 
Hi,
es geht immer noch um die Kassenschublade.
Es soll per button verhindert werden das die
Lade, die jam Comport ist, geöffnet werden kann.
Sprich dieses und ein anderes Programm welches dies
tut. Also systemweit den Comport dicht machen oder wieder
öffnen.
Danke!

Der_Unwissende 21. Jul 2006 14:47

Re: Comport sperren?
 
Also der einfachste Weg ist, dass du einfach dafür sorgst, dass dein Programm sehr früh gestartet wird (z.B. im Autostart) und dann auch gleich Connected = True setzt. Wird der ComPort erstmal von einer Applikation verwendet, so ist der Zugriff von aussen gesperrt. Das könnte dann auch dein Problem werden, wenn eine andere Anwendung den Port vor dir öffnet und offen hält.
In deinem eigenen Programm kannst du dann sehr leicht regeln, wann wirklich etwas gesendet wird und wann nicht. Hier reicht ja eine einfache if-Abfrage aus. Je nachdem ob irgendwas gemacht wurde wird dann über den Port gesendet oder nicht.

Privateer3000 21. Jul 2006 14:50

Re: Comport sperren?
 
Nein, es muss gewährleistet sein,
dass auch andere Programme noch
darauf zugreifen können und müssen.

Der_Unwissende 21. Jul 2006 15:04

Re: Comport sperren?
 
Hm, dass macht die Sache natürlich nicht leichter.
Also ich weiß dir hier nicht weiter zu helfen. Ich denke es gibt mehrere Möglichkeiten (mit denen ich mich in dem Fall dann zu wenig auskenne).
Das eine ist, dass es wirklich eine Methode gibt den Port zu aktivieren/deaktivieren.
Die andere Möglichkeit ist es, dass du mit einem Hook arbeitest. Dann würdest du immer mitbekommen, wenn jmd. etwas an den Port schicken möchte und kannst es ggf. einfach umleiten.
Die letzte Möglichkeit wäre es, dass du einen virtuellen Port erstellst (keine Ahnung wie, dürfte auch auf Hooks basieren), den alle Programme ansprechen. Hier kannst du dann wieder weiterleiten oder nicht.
Das alles ist wohl nicht ohne. Musst du mal schauen ob hier schon jmd. etwas in der Richtung versucht hat und/oder ob du vielleicht bei Google fündig wirst.

Vielleicht hat ja auch jmd. anderes einen Vorschlag!

Privateer3000 21. Jul 2006 15:28

Re: Comport sperren?
 
Was würde passieren, wenn ich mit Open
den Port öffne (per Button)? Ist er
dann für andere Anwendungen gesperrt?
Und zum freigeben wieder close sende?

Der_Unwissende 21. Jul 2006 16:16

Re: Comport sperren?
 
Wenn du den mittels open öffnest, dann werden die anderen Programme meckern. Da solltest du deswegen auch immer ein try ... except um eine eigene Anwendung bauen. Es kann immer mal was passieren (nur nebenbei bemerkt).
Jedenfalls ist im Besten Fall ein solches Ereignis behandelt und du siehst einfach, dass der Port in Benutzung sei. In schlechteren Fällen führt das zu einer runtime Exception, die nicht behandelt wird (Programm stürzt ab). Aber schreiben kann keiner.
Probier es einfach mal aus. Schreib dir ein Programm, dass einfach nur den Port öffnet. Das startest du und während es läuft rufst du das Hyperterminal auf und versuchst dich mit dem gleichen Port zu verbinden.

Privateer3000 21. Jul 2006 23:49

Re: Comport sperren?
 
Dann bliebe ja nur, sendungen an den/die Port(s) abzufangen und umzuleiten...
Hat jemand eine solche Idee?

jensw_2000 22. Jul 2006 02:41

Re: Comport sperren?
 
Das Abfangen funktioniert imho nicht so einfach.
Wenn die Kassensoftware z.B. den Port permanent offen hält, dann kannst du ihn nicht nehr Öffnen oder anderweitig "verbiegen", um den Steuerbefehl abzufangen.
Sollte die Kassensoftware den Port bei Bedarf belegen, kannst du ihn duch permanentes Offenhalten blockieren. Kabel rausziehen bewirkt das Selbe und erfordert keine Programmierarbeit.

Eventuell findest du irgendwo Hinweise zur Erstellung eines SerialPort Treibers. Dann kannst du dir einen für einen virtuellen COM-Post basteln, über den du die Kassensoftware mit deinem "Filter-Tool" verbindest. Dann kannst du alle, an den Virt-Com-Post gesendeten Daten prüfen, verändern und anschliessend an den COMx weiterleiten.


Schöne Grüße,
Jens
:hi:

Privateer3000 22. Jul 2006 12:23

Re: Comport sperren?
 
Also, keine der laufenden Software hält den Port offen. Das ist sicher.
Fragen wir mals so, wenn ich jetzt meiner applikation den Port offen halte,
wie verhalten sich dann die anderen? Kommt es zum Absturz, oder nur zu fehlermeldungen?

Gibt es noch andere möglichkeiten, ausser den Stecker rauszuziehen ;-)
Der Hintergrund als solcher ist, bedient wird über ein 3M-Touchpanel.
Wenn man über einen Schalter dasTouchscreen ausschaltet (sperrt),
bleibt der Touch aktiv. D.h. man kann noch Aktionen ausführen obwohl
der Bildschirm schwarz ist.Sprich: ein Druck auf die richtige Stelle
und über den comport wird die Lade geöffnet.

ratlos
Privateer

jensw_2000 22. Jul 2006 13:10

Re: Comport sperren?
 
Zitat:

Zitat von Privateer3000
Fragen wir mals so, wenn ich jetzt meiner applikation den Port offen halte,
wie verhalten sich dann die anderen? Kommt es zum Absturz, oder nur zu fehlermeldungen?

Wenn die Anwendung den belegten COM-Port öffnen möchte, wird eine Exception ausgelöst oder zumindest ein Fehler an die Anwendung zurückgegeben.
Was die Software mit dieser Information macht, musst du auspprobieren. Das kann von "Garnichts" (kommentarlos abgefangene Exception) über Meldungen ("Kann COM1 nicht öffnen", "Kommunikationsfehler mit Schublade" usw.) bis hin zum Programmabsturz durch eine unbehandelte AV alles sein.

Zitat:

Zitat von Privateer3000
Gibt es noch andere möglichkeiten, ausser den Stecker rauszuziehen ;-)
Der Hintergrund als solcher ist, bedient wird über ein 3M-Touchpanel.
Wenn man über einen Schalter dasTouchscreen ausschaltet (sperrt),
bleibt der Touch aktiv. D.h. man kann noch Aktionen ausführen obwohl
der Bildschirm schwarz ist.Sprich: ein Druck auf die richtige Stelle
und über den comport wird die Lade geöffnet.

hmm.
Wenn sich die Software bei belegtem COM-Porr ruhig verhält, dann musst du "nur noch" eine Möglichkeit finden, einen ausgeschalteten Monitor zu erkennen.
Wenn du was gefunden hast, aktivierst du dein CPortLib-COMPort wenn der Monitor inaktiv ist.
Delphi-Quellcode:
(CPortLib_COMport.active := NOT Monitor.active)
Eventuell kannst du den Ein-Aus Zustand des Monitors herausfinden, indem du über den Display Data Channel die PNP Daten des Monitors abfragst. >> Keine Daten = Monitor aus, Daten >> Monitor an ...
Dafür gibt aber sicher noch bessere Wege ...

Privateer3000 22. Jul 2006 13:19

Re: Comport sperren?
 
Das klingt sehr interessant.
Davon habe ich auch noch nie gehört, den Status des Monitors
abzufragen.

Hat jemand damit schonmal zu tun gehabt?

In der Tat wäre es eine Alternative,als mit
einem Button die Sperrung zu aktivieren/deaktivieren.

jensw_2000 22. Jul 2006 13:35

Re: Comport sperren?
 
Schau mal hier im MSDN.

Die WMI Klasse "Win32_DesktopMonitor" liefert ein paar interessante Werte zurück
Code:
0x07 Power Off
0x8 Off Line
0xD Power Save - Unknown
0xE Power Save - Low Power Mode
0xF Power Save - Standby
0x11 Power Save - Warning
Infos zur Verwendung von WMI mit Delphi gibt es hier im Forum reichlich.


Schöne Grüße,
Jens
:hi:

Privateer3000 22. Jul 2006 16:30

Re: Comport sperren?
 
vielen Dank,
sich da durch zuarbeiten dürfte etwas länger dauern.
wie erhält man die Rückgabewerte ?
Ist da in den systemutils von Delphi nichts vorgesehen?

jensw_2000 22. Jul 2006 20:48

Re: Comport sperren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Und jetzt erwartest du von uns, das wir uns für dich durch das Thema arbeiten ?
Ist nicht dein Ernst oder :roll: ?

... ich will man nich so sein.

Weil mich das Thema WMI schon länger interessierte, habe ich mit Hilfe des MSDN und dieses Artikels die Properties der Klasse "Win32_DesktopMonitor" bei eingeschaltetem und ausgeschaltetem Monitor ausgelesen.

Bei meinem uralt ADI 21" (CRT) wurde die Availability in beiden Fällen mit den Wert "0x3 Running/Full Power" ausgelesen.

Eventuell funtioniert es ja bei deinem Touchpanel.

Zum Testen hänge ich dir mam meine "Spiel-Exe" an.

Den zugehörenden Sourcecode bekommst du mit den beiden Links in 15 Minuten selbst hin.
Soviel Eigenenergie muss sein :warn: .



Schöne Grüße,
Jens
:hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:31 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