![]() |
C Header Konvertierung: Pointer <> THandle
Moin,
es geht mal wieder um die Konvertierung einer (der) C Header Datei nach Pascal. Eine Zuweisung die in C funktioniert läßt sich in Pascal so nicht umsetzen. Folgendes steht im C Header (abgekürzt):
Code:
und im C Demo steht:
typedef struct tagSCBARSCANNER
{ /* handle to image */ HANDLE pDIB; <-- wichtige Stelle } SCBARSCANNER, *PSCBARSCANNER; typedef struct tagSCIMAGE { /* the header, the palette, the pixels */ LPVOID pDIB; <-- wichtige Stelle } SCIMAGE, *PSCIMAGE;
Code:
Meine Übersetzung sieht so aus:
...
SCBARSCANNER scanner; SCIMAGE image; memset( &scanner, 0, sizeof(SCBARSCANNER)); memset( &image, 0, sizeof(SCIMAGE) ); ... scanner.pDIB = image.pDIB; <-- wichtige Stelle ...
Delphi-Quellcode:
und mein Pascal Demo:
type
PScImage = ^TScImage; tagSCIMAGE = packed record pDIB: Pointer; <-- wichtige Stelle end; TScImage = tagSCIMAGE; PScBarScanner = ^TScBarScanner; tagSCBARSCANNER = packed record // handle to image pDIB: THandle; <-- wichtige Stelle end; TScBarScanner = tagSCBARSCANNER;
Delphi-Quellcode:
Die Zuweisung von Pointer auf THandle will natürlich wegen inkompatiblen Typen nicht.
var
Scanner: TScBarScanner; Image: TScImage; begin FillChar(Scanner, SizeOf(TScBarScanner), 0); FillChar(Image, SizeOf(TScImage), 0); ... Scanner.pDIB:= Image.pDIB; <-- wichtige Stelle ... end; Kann mir einer helfen und mir sagen, wie ich das Problem lösen muss. Gruß Matthias |
Re: C Header Konvertierung: Pointer <> THandle
Funktioniert kein Type-Cast?
Scanner.pDIB := Integer (Image.pDIB); |
Re: C Header Konvertierung: Pointer <> THandle
Funktioniert schon, aber das Ergebnis ist eine Zugriffsverletzung.
Ich hab auch schon beides mal auf Pointer gestellt. |
Re: C Header Konvertierung: Pointer <> THandle
Mal eine andere Frage zu dem Problem.
Die Header Konvertierung ist für 2 DLL Dateien die ich mit Delphi ansprechen will. Die eine DLL lädt ein Bild, die zweite DLL verarbeitet das Bild. Hat die zweite DLL überhaupt Zugriff auf das geladene Bild der ersten DLL. Wie ist das mit den Austausch vom Speicher? Gruß Matthias |
Re: C Header Konvertierung: Pointer <> THandle
Ob nun beides auf Pointer umgestellt oder Scanner.pDIB := Integer(Image.pDIB);,
es kommt beides vom Speicher her auf das Selbe raus und ansonsten sehen die Definitionen schon OK aus. PS: ich würd das THandle lassen und Scanner.pDIB := Integer(Image.pDIB); verwenden Also muß es an einer anderen Stelle haken ... z.B. siehe Brainshock Wo tritt denn der Fehler (die Exception) auf? |
Re: C Header Konvertierung: Pointer <> THandle
Bei der Zuweisung wird ja noch keine Zugriffsverletzung ausgelöst. Erst, wenn ich versuche die Barcodes vom Bild zu lesen:
Delphi-Quellcode:
C ist:
Scanner.pDIB:= Integer(Image.pDIB); // okay
ret:= ScScanBar(PScBarScanner(@Scanner)); // Zugriffsverletzung
Code:
------------
scanner.pDIB = image.pDIB;
ret = ScScanBar(&scanner); C Header:
Code:
Delphi:
DllImport WORD ScScanBar( PSCBARSCANNER pScanner);
Delphi-Quellcode:
function ScScanBar(pScanner: PScBarScanner): Word; {$IFDEF WIN32} stdcall; {$ENDIF}
|
Re: C Header Konvertierung: Pointer <> THandle
Zitat:
|
Re: C Header Konvertierung: Pointer <> THandle
Gut, kann das mit den Typecast auf THandle kann ich ja machen.
Nur ist ein Zugriff auf einen Speicherbereich zwischen diesen beiden DLL Dateien überhaupt (in Delphi) möglich? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 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