AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein C Header Konvertierung: Pointer <> THandle
Thema durchsuchen
Ansicht
Themen-Optionen

C Header Konvertierung: Pointer <> THandle

Ein Thema von Brainshock · begonnen am 22. Jan 2009 · letzter Beitrag vom 22. Jan 2009
Antwort Antwort
Brainshock

Registriert seit: 26. Nov 2004
Ort: 37345
214 Beiträge
 
Delphi 7 Professional
 
#1

C Header Konvertierung: Pointer <> THandle

  Alt 22. Jan 2009, 09:44
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
Matthias
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: C Header Konvertierung: Pointer <> THandle

  Alt 22. Jan 2009, 09:54
Funktioniert kein Type-Cast?

Scanner.pDIB := Integer (Image.pDIB);
  Mit Zitat antworten Zitat
Brainshock

Registriert seit: 26. Nov 2004
Ort: 37345
214 Beiträge
 
Delphi 7 Professional
 
#3

Re: C Header Konvertierung: Pointer <> THandle

  Alt 22. Jan 2009, 10:10
Funktioniert schon, aber das Ergebnis ist eine Zugriffsverletzung.

Ich hab auch schon beides mal auf Pointer gestellt.
Matthias
  Mit Zitat antworten Zitat
Brainshock

Registriert seit: 26. Nov 2004
Ort: 37345
214 Beiträge
 
Delphi 7 Professional
 
#4

Re: C Header Konvertierung: Pointer <> THandle

  Alt 22. Jan 2009, 10:17
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
Matthias
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#5

Re: C Header Konvertierung: Pointer <> THandle

  Alt 22. Jan 2009, 10:36
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?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Brainshock

Registriert seit: 26. Nov 2004
Ort: 37345
214 Beiträge
 
Delphi 7 Professional
 
#6

Re: C Header Konvertierung: Pointer <> THandle

  Alt 22. Jan 2009, 10:49
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:

function ScScanBar(pScanner: PScBarScanner): Word; {$IFDEF WIN32} stdcall; {$ENDIF}
Matthias
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: C Header Konvertierung: Pointer <> THandle

  Alt 22. Jan 2009, 12:12
Zitat von Brainshock:
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.
  Mit Zitat antworten Zitat
Brainshock

Registriert seit: 26. Nov 2004
Ort: 37345
214 Beiträge
 
Delphi 7 Professional
 
#8

Re: C Header Konvertierung: Pointer <> THandle

  Alt 22. Jan 2009, 13:08
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?
Matthias
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz