Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi C-Header konvertierung: Struct verweist auf sich selbst? (https://www.delphipraxis.net/85844-c-header-konvertierung-struct-verweist-auf-sich-selbst.html)

grl 5. Feb 2007 18:46


C-Header konvertierung: Struct verweist auf sich selbst?
 
Schönen guten Abend!

Ich hab bei der Konvertierung eines C++-Header ein Problem. Vielleicht ist hier jemand, der mir da weiterhelfen kann?

Der (gekürzte) C++-Header sieht so aus:
Code:
typedef struct _MONITOR
{
    BOOL (WINAPI *pfnEnumPorts)
    (
    LPWSTR  pName,
    DWORD  Level,
    LPBYTE pPorts,
    DWORD  cbBuf,
    LPDWORD pcbNeeded,
    LPDWORD pcReturned
    );

    BOOL (WINAPI *pfnOpenPort)
    (
    LPWSTR pName,
    PHANDLE pHandle
    );

    BOOL (WINAPI *pfnOpenPortEx)
    (
    LPWSTR pPortName,
    LPWSTR pPrinterName,
    PHANDLE pHandle,
    struct _MONITOR FAR *pMonitor
    );
} MONITOR, FAR *LPMONITOR;
In Delphi hab ich den ersten Teil so umgesetzt:

Delphi-Quellcode:
type
  rMonitor=packed record
    pfnEnumPorts: function (pName:PWideChar;dwLevel:DWORD;pPorts:PByte;
                            cbBuf:DWORD;var pdwNeeded,pdwReturned:DWORD):LongBool;stdcall;
    pfnOpenPort: function (pName:PWideChar;pH:PHandle):LongBool;stdcall;
    pfnOpenPortEx: function (pName,pPrinterName:PWideChar;pH:PHandle;
                             _Monitor:rMonitor):LongBool;stdcall;
  end;
Und in pfnOpenPortEx liegt das Problem: Soweit ich den C-Code verstanden habe, ist der 4. Parameter der Funktion pfnOpenPortEx eine Struktur von genau dem Typ den wir aber gerade definieren.

Kann mir jemand weiterhelfen, wie man das korrekt umsetzt?

Gruß
Luggi

shmia 5. Feb 2007 18:54

Re: C-Header konvertierung: Struct verweist auf sich selbst?
 
Bei einer Klasse würde hier eine "vorwärts Deklaration" helfen:
Delphi-Quellcode:
type
  rMonitor = class; // forward declaration

  rMonitor= class(TObject)
  public
    pfnEnumPorts: function (pName:PWideChar;dwLevel:DWORD;pPorts:PByte;
                            cbBuf:DWORD;var pdwNeeded,pdwReturned:DWORD):LongBool;stdcall;
    pfnOpenPort: function (pName:PWideChar;pH:PHandle):LongBool;stdcall;
    pfnOpenPortEx: function (pName,pPrinterName:PWideChar;pH:PHandle;
                             _Monitor:rMonitor):LongBool;stdcall;
  end;
Beim Record wird's aber schwierig...

grl 5. Feb 2007 18:57

Re: C-Header konvertierung: Struct verweist auf sich selbst?
 
Schon klar - aber kann ich das dann immer noch verwenden um einen C-DLL in Delphi nachzubilden? Soweit ich weiß nein, oder?

Danke
Luggi

Robert Marquardt 5. Feb 2007 19:07

Re: C-Header konvertierung: Struct verweist auf sich selbst?
 
Das ist recht einfach. Es wird ja nur ein Zeiger auf die Struktur benoetigt.
Da erlaubt Delphi es auch den Zeigertyp vor dem Record zu deklarieren. Es muss nur im gleichen type-Keyword-Bereich sein.
Da ist Delphi sogar eleganter als C wo extra der Hilfsname des structs (_MONITOR) eingefuehrt wurde um das zu handhaben.
Delphi-Quellcode:
type
  LPMONITOR = ^MONITOR;
  MONITOR = packed record
    pfnEnumPorts: function(pName: PWideChar; dwLevel: DWORD; pPorts: PByte;
                           cbBuf: DWORD; var pdwNeeded, pdwReturned: DWORD): LongBool; stdcall;
    pfnOpenPort: function (pName: PWideChar; var H: THandle): LongBool; stdcall;
    pfnOpenPortEx: function (pName, pPrinterName: PWideChar; var H: THandle;
                             _Monitor: LPMONITOR): LongBool; stdcall;
  end;
Ich wette auch mal darauf das die PHandle-Parameter var-Parameter sind (entsprechend korrigiert).

Es empfiehlt sich hier dringend Hilfstypen fuer die Funktionszeiger zu deklarieren.

Delphi-Quellcode:
type
  LPMONITOR = ^MONITOR;

  TMonitorEnumPortsFunc = function(pName: PWideChar; dwLevel: DWORD; pPorts: PByte;
    cbBuf: DWORD; var pdwNeeded, pdwReturned: DWORD): LongBool; stdcall;
  TMonitorOpenPortFunc = function (pName: PWideChar; var H: THandle): LongBool; stdcall;
  TMonitorOpenPortExFunc = function (pName, pPrinterName: PWideChar; var H: THandle;
    _Monitor: LPMONITOR): LongBool; stdcall;

  MONITOR = packed record
    pfnEnumPorts: TMonitorEnumPortsFunc;
    pfnOpenPort: TMonitorOpenPortFunc;
    pfnOpenPortEx: TMonitorOpenPortExFunc;
  end;
Oops, da war ein Fehler.

grl 5. Feb 2007 19:10

Re: C-Header konvertierung: Struct verweist auf sich selbst?
 
Manchmal sitzt man wirklich ein bischen auf der Leitung....

Auch das mit den Hilfstypen ist natürlich richtig - ich habs nur hier weggelassen um nicht von meinem eigentlichen Verständnisproblem abzulenken.

Danke für die - superprompte - Hilfe!

Danke
Luggi


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