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 DLL Aufruf (void**)&aImgFormat nach Delphi (https://www.delphipraxis.net/84087-dll-aufruf-void%2A%2A-aimgformat-nach-delphi.html)

yörsch 11. Jan 2007 07:22


DLL Aufruf (void**)&aImgFormat nach Delphi
 
Hallo Zusammen,

ich brüte seit einpaar Tagen wie der C-Code in Delphi umzusetzen ist :wall:

Code:
int nImgFormat;
tpBoImgFormat* aImgFormat;

nRetCode = FX_GetCapability( 0, 0, 0, (void**)&aImgFormat, &nImgFormat );

Hat jemand so ein C müll (void**)& schnn mal sinnvoll umgesetzt :gruebel:

Gruß
Jörg

ste_ett 11. Jan 2007 07:26

Re: DLL Aufruf (void**)&aImgFormat nach Delphi
 
& bedeutet, dass du die Speciheradresse der Variablen ansprichst.

Das Umcasten nach void** brauchst du unter Delphi nicht. :)

r2c2 11. Jan 2007 08:11

Re: DLL Aufruf (void**)&aImgFormat nach Delphi
 
Da es yörsch nicht für nötig befunden hat, den Crosspost zu verlinken, mach ich das eben:
http://forum.dsdt.info/viewtopic.php?t=32018

Wenn es sich um einen Array handelt, dann solltest du einfach so indizieren können(arrays sind in C++ etwas anders, als in Delphi). Poste mal die Deklaration von tpBoImgFormat und FX_GetCapability...

mfg

Christian

yörsch 11. Jan 2007 08:47

Re: DLL Aufruf (void**)&aImgFormat nach Delphi
 
So sieht die definition in C aus:


Code:
DWORD WINAPI FX_GetCapability(    IN int iCamId, IN eBCAMQUERYCAP eCap, IN int iIdent, OUT PVOID * ppCap, OUT int * piCapNumber );


typedef struct {
   int   iFormat;      
   int    iSizeX;
   int     iSizeY;
   int    iPixelBytes;
   int     iPixelBits;
   char *    aName;
   int   iColor;
   float   iSizeRoiScaleX;
   float   iSizeRoiScaleY;
   SIZE   sOffset;

}tBoImgFormat, *tpBoImgFormat;

und so sieht meine umsetzung aus

Delphi-Quellcode:
tBoImgFormat = record
    iFormat       : integer ;
    iSizeX        : LongWord;
    iSizeY        : LongWord;
    iPixelBytes   : LongWord;
    iPixelBits    : LongWord;
    aName         : PCHAR;  
    iColor    : LongWord;   
    iSizeRoiScaleX : integer;
    iSizeRoiScaleY : integer;
    sOffset       : t_size;
    iMinPacketSize : LongWord;
    iMaxPacketSize : LongWord;
  end;
  tpBoImgFormat = ^tBoImgFormat;
 
  aImgFormat : array of tpBoImgFormat;
  HELP : String;

  ...

  fReturn := FX_GetCapability(0, 0, 0, @aImgFormat , @nImgFormat );

  for j := 0 to nImgFormat -1 do
    begin
       HELP := Format('Format[%02d] WxH:%04dx%04d Bpp/Bits:%d/%02d ',
                          [aImgFormat[j]^.iFormat,   aImgFormat[j]^.iSizeX,
                           aImgFormat[j]^.iSizeY,    aImgFormat[j]^.iPixelBytes,
                           aImgFormat[j]^.iPixelBits ]);
       SetStati('Capability ' + inttostr(J),Help);
    end;
Gruß
Jörg

ste_ett 11. Jan 2007 08:54

Re: DLL Aufruf (void**)&aImgFormat nach Delphi
 
Deine Deklaration der Funktion in Delphi fehlt.

Die Deklaration für "eBCAMQUERYCAP" fehlt.

Deine Portierung der Struktur ist nicht korrekt.
An einigen Stellen hast du aus "int" LongWord gemacht, es muss Integer heissen.
Die Reihenfolge der Variablen in der Struktur / im Record sollte engehalten werden.

Delphi-Quellcode:
function FX_GetCapability(iCamId: Integer; eCap: eBCAMQUERYCAP; iIdent: Integer; ppCap: PPointer; piCapNumber: PInteger): DWORD; stdcall;
Alternativ:

Delphi-Quellcode:
function FX_GetCapability(iCamId: Integer; eCap: eBCAMQUERYCAP; iIdent: Integer; var ppCap: Pointer; var piCapNumber: Integer): DWORD; stdcall;

OregonGhost 11. Jan 2007 08:59

Re: DLL Aufruf (void**)&aImgFormat nach Delphi
 
Entweder fehlt mir gerade der Kaffee, oder die Übersetzung der Struktur ist schonmal ff (völlig falsch) Oo

LongWord würde ich auf Anhieb als vorzeichenlos einstufen. Damit hast du den Großteil der ints (aber nicht alle) übersetzt, warum?
float hast du hingegen mit Integer übersetzt, Real wäre hier richtig, wenn mich meine eingerosteten Delphikenntnisse nicht trügen (oder war's Single? *g*).
SIZE ist ein Windows-Typ, der mit TSize in Delphi korrespondiert und nicht mit t_size (nie gehört, kannte bisher nur size_t, und das in C).
Und dann hast du noch zwei Member hinzugefügt, das schadet zwar im besten Fall nicht, aber warum?

Und dann kann man doch bei Aufrufen von C-Funktionen aus Delphi heraus Ausgabeparameter auch als var deklarieren, oder? Das vereinfacht den Aufruf, aber ich bin nicht sicher, inwieweit man weitere Maßnahmen treffen müsste.

Edit roter Kasten: OK, das mit dem var wäre damit geklärt *g*. Den Enum muss er nicht unbedingt deklarieren, wenn er davon ausgehen kann, immer nur 0 zu übergeben.

yörsch 11. Jan 2007 09:08

Re: DLL Aufruf (void**)&aImgFormat nach Delphi
 
Ja OK, sorry...

Delphi-Quellcode:
FUNCTION FX_GetCapability ( iCamId,eCap,iIdent:Integer; ppCap : tpBoImgFormat; piCapNumber : PINT ) :DWORD; STDCALL; External DLLFile;
das umcasten kann mann sich sparen (tipp von ste_ett ) und liefert die gleich schlechten ergebnisse wie mit!


iCamId,eCap,iIdent:Integer; setze ich erlaubter weise zu : 0

um euch nicht zur mehr zu verwirren als nötig!

Das die DLL richtig arbeitet sehe ich :
- an piCapNumber <> 0 und
- der Returnwert ist 1 :drunken:


Erwischt!
aber der falsche record hat keinen einfluß auf die ersten werte...
Für mich sind iSizeX und iSizeY die wichtigen werte...

------------------------------------------------------------

DICKES DANKE AN ALLE !!!! :love:

ICH HAB den FEHLER! --> Wenn 0 erwartet wird sollte mann auch an irgendeiner stelle 0 Setzen !!! ich sach nur eCap...

Es war einer von der Sorte : ich seh den wald vor bäumen nicht ...


Gruß
Jörg

Muetze1 11. Jan 2007 12:59

Re: DLL Aufruf (void**)&aImgFormat nach Delphi
 
Zitat:

Zitat von ste_ett
Deine Portierung der Struktur ist nicht korrekt.
An einigen Stellen hast du aus "int" LongWord gemacht, es muss Integer heissen.

Nein, LongInt, wenn es denn 32 Bit gross bleiben soll auch auf einem 64 Bit Pascal Compiler (Freepascal?).

Zitat:

Zitat von OregonGhost
float hast du hingegen mit Integer übersetzt, Real wäre hier richtig, wenn mich meine eingerosteten Delphikenntnisse nicht trügen (oder war's Single? *g*).

Real ist eigentlich der alte Pascal eigene 6 Byte grosse Fließkommatyp aus Turbo Pascal Zeiten. Unter Delphi ist er abhängig von den Compilereinstellungen Real48 oder Double. Wenn wäre float = single, damit liegst du dann richtig.


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