Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
3.916 Beiträge
 
Delphi 12 Athens
 
#3

AW: Virtueller COM Port CP210x: Problem unter Win8.1

  Alt 23. Jul 2015, 07:30
danke für den Tip.
ComPort hatte ich mir vor Jahren schonmal angeschaut, werde ich mir auf jeden Fall mal in der aktuellen Version ansehen.

Ich glaube ich habe schon ein mögliches Problem gefunden, es gibt einen dieser vergessenen CompilerSchalter
Code:
{$IFDEF VER200} {$DEFINE NEWDELPHI} {$ENDIF}  { BDS 2009 }
//S4: Added
{$IF CompilerVersion >= 20.0} {$DEFINE NEWDELPHI} {$ENDIF}  { XE+ }  // Added
{$IFDEF FPC}    {$MODE DELPHI}      {$ENDIF}  { Lazarus }
Der war aber schon vorher hart auf NEWDELHPI gesetzt, deshalb hat es vorher auch schon funktioniert.

Das wird dann hier so eingesetzt:
Code:
  {$IFDEF NEWDELPHI}
  c : array[0..63] of WideChar; // <-- hier kommt er vorbei
  {$ELSE}
  c : array[0..63] of char;
  {$ENDIF}
Jedenfalls ann alle die auch noch die Toolbox Serial-Library im Einsatz haben:
- Mal nach NEWDELPHI schauen



!! Trotzdem funktioniert es noch nicht (genausowenig wie in AsyncPro).
Das Problem scheint tiefer zu liegen, denn CreateFile() lässt sich einfach nicht verbinden.
Der COM-Port ist sichtbar und OK im GeräteManager.

Ich habe ja XE8 im Verdacht, weil ich da schon andere Seltsamkeiten gesehen habe.

Hat sie vielleicht etwas an CreateFile geändert ?

Die XE8 Defines sind bei mir so definiert:
Code:
  GENERIC_READ            = DWORD($80000000);
  {$EXTERNALSYM GENERIC_READ}
  GENERIC_WRITE           = $40000000;
  {$EXTERNALSYM GENERIC_WRITE}

  OPEN_EXISTING = 3;
  {$EXTERNALSYM OPEN_EXISTING}

  FILE_ATTRIBUTE_NORMAL              = $00000080;
  {$EXTERNALSYM FILE_ATTRIBUTE_NORMAL}

  FILE_FLAG_OVERLAPPED = $40000000;
  {$EXTERNALSYM FILE_FLAG_OVERLAPPED}

{$IFDEF MSWINDOWS}
  FixedInt = LongInt;
  FixedUInt = LongWord;
{$ENDIF}
{$IFDEF POSIX}
  FixedInt = Integer;
  FixedUInt = Cardinal;
{$ENDIF}


  DWORD = FixedUInt;
  {$EXTERNALSYM DWORD}

  DWORD = System.Types.DWORD;
  {$EXTERNALSYM DWORD}
Da sehe ich auch keine Fehler.

Übrigens scheint die ComPort-Komponente das gleiche zu machen:
Da sehe ich prinzipiell keinen Unterschied bei allen drei Lösungen, sondern eher bei CreateFile selbst.

Code:
// create handle to serial port
procedure TCustomComPort.CreateHandle;
begin
  FHandle := CreateFile(
    PChar('\\.\' + FPort),
    GENERIC_READ or GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED,
    0);

  if FHandle = INVALID_HANDLE_VALUE then
    //raise EComPort.Create
    CallException(CError_OpenFailed, GetLastError);
end;

Rollo
  Mit Zitat antworten Zitat