Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C Header Konvertierung: Pointer <> THandle (https://www.delphipraxis.net/127980-c-header-konvertierung-pointer-thandle.html)

Brainshock 22. Jan 2009 08:44


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:
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;
und im C Demo steht:

Code:
...
SCBARSCANNER scanner;
SCIMAGE image;
memset( &scanner, 0, sizeof(SCBARSCANNER));
memset( &image, 0, sizeof(SCIMAGE) );
...
scanner.pDIB = image.pDIB;        <-- wichtige Stelle
...
Meine Übersetzung sieht so aus:

Delphi-Quellcode:
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;
und mein Pascal Demo:

Delphi-Quellcode:
var
  Scanner: TScBarScanner;
  Image: TScImage;
begin
  FillChar(Scanner, SizeOf(TScBarScanner), 0);
  FillChar(Image, SizeOf(TScImage), 0);
  ...
  Scanner.pDIB:= Image.pDIB;           <-- wichtige Stelle
  ...
end;
Die Zuweisung von Pointer auf THandle will natürlich wegen inkompatiblen Typen nicht.
Kann mir einer helfen und mir sagen, wie ich das Problem lösen muss.

Gruß
Matthias

nuclearping 22. Jan 2009 08:54

Re: C Header Konvertierung: Pointer <> THandle
 
Funktioniert kein Type-Cast?

Scanner.pDIB := Integer (Image.pDIB);

Brainshock 22. Jan 2009 09:10

Re: C Header Konvertierung: Pointer <> THandle
 
Funktioniert schon, aber das Ergebnis ist eine Zugriffsverletzung.

Ich hab auch schon beides mal auf Pointer gestellt.

Brainshock 22. Jan 2009 09:17

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

himitsu 22. Jan 2009 09:36

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?

Brainshock 22. Jan 2009 09:49

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:
Scanner.pDIB:= Integer(Image.pDIB); // okay
ret:= ScScanBar(PScBarScanner(@Scanner)); // Zugriffsverletzung
C ist:

Code:
scanner.pDIB = image.pDIB;
ret = ScScanBar(&scanner);
------------

C Header:

Code:
DllImport WORD ScScanBar( PSCBARSCANNER pScanner);
Delphi:

Delphi-Quellcode:
function ScScanBar(pScanner: PScBarScanner): Word; {$IFDEF WIN32} stdcall; {$ENDIF}

jbg 22. Jan 2009 11:12

Re: C Header Konvertierung: Pointer <> THandle
 
Zitat:

Zitat von Brainshock
Delphi-Quellcode:
Scanner.pDIB:= Integer(Image.pDIB); // okay

Aber nur solange Image.pDIB nicht oberhalb der 2 GB grenze liegt und du einen 32 Bit Compiler benutzt. Wenn links vom := ein THandle steht, dann typecaste auch in ein THandle.

Brainshock 22. Jan 2009 12:08

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