Discussion:
COM Ports größer 9 in Delphi6
(zu alt für eine Antwort)
Ole Jansen
2017-04-20 13:55:45 UTC
Permalink
Moin,

In Delphi6 arbeitet ein Programm mit seriellen Schnittstellen.
Von COM1 bis COM9 funktionierte es seit Jahren von Windows NT4
bis Windows10.

Ab COM10 kann das Programm kein Handle auf den Anschluss allokieren.

Der ursprüngliche Code sieht etwa so aus:

var ComPort:string;
ComHandle:THandle;
...

COMPort := 'COM'+IntToStr(port);

...

ComHandle := CreateFile(pchar(COMPort), GENERIC_READ or
GENERIC_WRITE, 0, nil,
OPEN_EXISTING, 0, 0);

Gemäß:
<https://support.microsoft.com/en-us/help/115831/howto-specify-serial-ports-larger-than-com9>

habe ich es so probiert:

COMPort := '\\\\.\\COM'+IntToStr(port);

Damit funktioniert es überhaupt nicht.
Nach etwas Rumprobieren habe ich herausgefunden, dass

COMPort := '\\?\COM'+IntToStr(port);

Funktioniert. Zumindest unter Windows7.
Kann mich jemand aufklären was da los ist?

Viele Grüße und vielen Dank,

O.J.
Steffen Christgau
2017-04-20 18:51:46 UTC
Permalink
Post by Ole Jansen
COMPort := '\\\\.\\COM'+IntToStr(port);
Damit funktioniert es überhaupt nicht.
Die MSDN-Doku zeigt dir C-Code. Da muss man den Backslash escapen - mit
einem Backslash. Also ein doppelter Backslash in C entspricht einem in
Delphi.
Post by Ole Jansen
Nach etwas Rumprobieren habe ich herausgefunden, dass
COMPort := '\\?\COM'+IntToStr(port);
Funktioniert. Zumindest unter Windows7.
Kann mich jemand aufklären was da los ist?
Gemäß MS-Doku, müsste das aber schon '\\.\' sein, mit Punkte - nicht mit
Fragezeichen:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#win32_device_namespaces


Die Doku von CreateFile sagt das auch.

Ich hab hier Code, der diese Konvention benutzt, unter Windows XP bis 10
ohne Probleme am laufen.

Gruß, Steffen
Ole Jansen
2017-04-21 07:54:23 UTC
Permalink
Post by Steffen Christgau
Post by Ole Jansen
COMPort := '\\\\.\\COM'+IntToStr(port);
Damit funktioniert es überhaupt nicht.
Die MSDN-Doku zeigt dir C-Code. Da muss man den Backslash escapen - mit
einem Backslash. Also ein doppelter Backslash in C entspricht einem in
Delphi.
Ach stimmt, da war ja was... Brett vorm Kopf ist weg.
(Ich hatte zwischendurch was von UTF8/16 in UNC Pfaden gegoogelt
und war total verwirrt...)

Danke!

O.J.

Loading...