![]() |
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 |
Re: DLL Aufruf (void**)&aImgFormat nach Delphi
& bedeutet, dass du die Speciheradresse der Variablen ansprichst.
Das Umcasten nach void** brauchst du unter Delphi nicht. :) |
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:
![]() 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 |
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:
Gruß
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; Jörg |
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:
Alternativ:
function FX_GetCapability(iCamId: Integer; eCap: eBCAMQUERYCAP; iIdent: Integer; ppCap: PPointer; piCapNumber: PInteger): DWORD; stdcall;
Delphi-Quellcode:
function FX_GetCapability(iCamId: Integer; eCap: eBCAMQUERYCAP; iIdent: Integer; var ppCap: Pointer; var piCapNumber: Integer): DWORD; stdcall;
|
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. |
Re: DLL Aufruf (void**)&aImgFormat nach Delphi
Ja OK, sorry...
Delphi-Quellcode:
das umcasten kann mann sich sparen (tipp von ste_ett ) und liefert die gleich schlechten ergebnisse wie mit!
FUNCTION FX_GetCapability ( iCamId,eCap,iIdent:Integer; ppCap : tpBoImgFormat; piCapNumber : PINT ) :DWORD; STDCALL; External DLLFile;
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 |
Re: DLL Aufruf (void**)&aImgFormat nach Delphi
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:37 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