Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi COM Ports im System auslesen (https://www.delphipraxis.net/118592-com-ports-im-system-auslesen.html)

TurboMagic 9. Mär 2020 22:36

AW: COM Ports im System auslesen
 
Hallo,

eine solche Komponente brauchst du dafür gar nicht.
Platziere eine TApplicationEvents Komponente (gibt's hoffentlich in D6 schon)
auf deiner Form und schaue dir mal die Events dieser an. Die sollte ein vergleichbares
bieten wie Rollo62 es benutzt hat.

Dort dann mal den Inhalt seiner WinProc Methode einfügen.

Grüße
TurboMagic

Rollo62 10. Mär 2020 08:36

AW: COM Ports im System auslesen
 
Das ist eine eigene Klasse, in der ich das gekapselt habe.
Ich hatte ja geschrieben das dort auch noch mehr drumrum zur Absicherung ist.

himitsu 10. Mär 2020 11:38

AW: COM Ports im System auslesen
 
Vermutlich musst du vorher dein Programm noch registieren, damit was ankommt.
https://docs.microsoft.com/en-us/win...enotificationa


und deine Codes bitte in [DELPHI]...[/DELPHI] oder [CODE]...[/CODE]

1967Schorsch 10. Mär 2020 16:59

AW: COM Ports im System auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habs dann irgendwie geschafft ein ApplicationEvents per Komponente einzufügen (Anfängerglück :shock:).
In den Events sehe ich jetzt nicht was so ähnlich heißt wie seine TSerialManager.WinProc Prozedur.:cry:

:?:

himitsu 10. Mär 2020 17:24

AW: COM Ports im System auslesen
 
Application.OnMessage (Unit Forms) oder besser TApplicationEvents.OnMessage, weil es das mehrfach geben kann und man sich nicht selbst überschreibt.

Dort kommt alles vorbei, was via MSDN-Library durchsuchenPostMessage und MSDN-Library durchsuchenPostThreadMessage im Hauptthread des Programms eintrudelt,
und durch Application.Run bzw. Application.ProcessMessages/HandleMessage durchrauscht. (die Hauptbearbeitungsstellen der MessageQueue für unsere VCL)

Probleme gibt es nur, wenn jemand/etwas MSDN-Library durchsuchenPeekMessage/MSDN-Library durchsuchenGetMessage manuell aufruft und es nicht über Application.ProcessMessages oder .HandleMessage behandeln lässt, welche das OnMessage aufrufen.
z.B. in einigen Implementationen von Delay, als Nichthängenbleibender Ersatz des Sleep oder während ein Windows-Dialog ala MSDN-Library durchsuchenMessageBox angezeigt wird.

Diese Messages dürften via PostMessage als Broadcast im System verteilt werden
und standardmäßig nur an TopLevel-Fenster, wie z.B. die Hauptform oder das unsichtbare ControlWindow in Forms.Application.

Wie gesagt, MSDN-Library durchsuchenSendMessage kommt in dem Event blöder Weise nicht vorbei, dafür müsste man sich einen GetMessage-Hook basteln, falls es so ankommt.
https://docs.microsoft.com/en-us/win...sg/about-hooks


Es kann aber sein, dass diese Message hier nur an jene Fenster gesendet wird, welche sich vorher registriert haben.
https://docs.microsoft.com/en-us/win...enotificationa

Das Problem mit den an falscher Stelle behandelten/abgefangenen Messages, genauso wie für das übersehene SendMessage,
kann man sich da nun das WndProc seiner Form überschreiben oder die Message direkt anhängen,
Delphi-Quellcode:
procedure WndProc(var Message: TMessage); override;
bzw.
procedure WMDeviceChangeOderSo(var Message: TMessage); message WM_DEVICECHANGE; // hier geht statt TMessage auch ein passender Typ, siehe TWMSize in Forms.pas
oder man empfängt sowas in einem eigenen Thread mit einer unabhängigen "unsichtbaren" MessageOnly-Form (ähnlich der in Application).

1967Schorsch 11. Mär 2020 13:07

AW: COM Ports im System auslesen
 
Hallo,
ich denke ich habe verstanden was du mir sagen willst.

Schade das es mit der Version (Delphi 6, ApplicationEvents Komponente) wohl nicht geht oder nicht so einfach ist.

Sich eine GetMessage-Hook basteln hört sich interessant an, nur wenn man (ich) nicht weis was man da tut, ist es schier unmöglich.
Schade und das nur um mitzubekommen ob der ausgewählte COM Anschluss/ USB Adapter abgesteckt wurde. Die Kommunikation über den Port erledigt ein anderes Programm was erst danach aufgerufen wird.

DANKE !!!:thumb:

1967Schorsch 11. Mär 2020 17:01

AW: COM Ports im System auslesen
 
Ich habe nochmal geschaut ..... mit meiner Software steuere ich per ShellExecute die AVRootloader Software an.
Nach Rescherge wurde diese durch Hagen in Delphi 5 geschrieben. Die Behandlung der COM Schnittstelle funkrioniert wie ich das auch hinbekommen möchte. Dann hat er sich sicher auch ein GetMessage-Hook gebastelt.

Hier Version 6 der AVRootloader Software aus dem Microcontroller Forum
https://www.mikrocontroller.net/topi...195903#1195903

HolgerX 12. Mär 2020 10:41

AW: COM Ports im System auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm..


Zitat:

Zitat von 1967Schorsch (Beitrag 1459482)
Schade das es mit der Version (Delphi 6, ApplicationEvents Komponente) wohl nicht geht oder nicht so einfach ist.

Sich eine GetMessage-Hook basteln hört sich interessant an, nur wenn man (ich) nicht weis was man da tut, ist es schier unmöglich.
Schade und das nur um mitzubekommen ob der ausgewählte COM Anschluss/ USB Adapter abgesteckt wurde. Die Kommunikation über den Port erledigt ein anderes Programm was erst danach aufgerufen wird.


Anbei mal ein einfaches Testtool..
Dieses Reagiert, wenn ich ein USB/COM Adapter einstecke, bzw. Abziehe und gibt mir den entsprechenden Port (COM3..).

Das WM_DEVICECHANGE für DBT_DEVTYP_PORT wird übrigens ohne Registrierung an jedes TopLevel (Hauptfenster) einer Applikation geschickt.

Wie Du siehst nur wenig Source-Code.

Erstellt mit D6 und getestet auf Windows 7.

1967Schorsch 12. Mär 2020 14:28

AW: COM Ports im System auslesen
 
Hallo Holger,
super klasse...... genau das habe ich gesucht.

Vielen Dank für die Hilfe:-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:00 Uhr.
Seite 4 von 4   « Erste     234   

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