![]() |
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 |
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 |
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! |
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. |
Re: Comport sperren?
Nein, es muss gewährleistet sein,
dass auch andere Programme noch darauf zugreifen können und müssen. |
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! |
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? |
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. |
Re: Comport sperren?
Dann bliebe ja nur, sendungen an den/die Port(s) abzufangen und umzuleiten...
Hat jemand eine solche Idee? |
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: |
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 |
Re: Comport sperren?
Zitat:
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:
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:
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 ...
(CPortLib_COMport.active := NOT Monitor.active)
Dafür gibt aber sicher noch bessere Wege ... |
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. |
Re: Comport sperren?
Schau mal
![]() Die WMI Klasse "Win32_DesktopMonitor" liefert ein paar interessante Werte zurück
Code:
Infos zur Verwendung von WMI mit Delphi gibt es hier im Forum reichlich.
0x07 Power Off
0x8 Off Line 0xD Power Save - Unknown 0xE Power Save - Low Power Mode 0xF Power Save - Standby 0x11 Power Save - Warning Schöne Grüße, Jens :hi: |
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? |
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 ![]() ![]() 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