![]() |
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:
In Delphi hab ich den ersten Teil so umgesetzt:
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;
Delphi-Quellcode:
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.
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; Kann mir jemand weiterhelfen, wie man das korrekt umsetzt? Gruß Luggi |
Re: C-Header konvertierung: Struct verweist auf sich selbst?
Bei einer Klasse würde hier eine "vorwärts Deklaration" helfen:
Delphi-Quellcode:
Beim Record wird's aber schwierig...
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; |
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 |
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:
Ich wette auch mal darauf das die PHandle-Parameter var-Parameter sind (entsprechend korrigiert).
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; Es empfiehlt sich hier dringend Hilfstypen fuer die Funktionszeiger zu deklarieren.
Delphi-Quellcode:
Oops, da war ein Fehler.
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; |
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