AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi DLL Aufruf (void**)&aImgFormat nach Delphi
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Aufruf (void**)&aImgFormat nach Delphi

Ein Thema von yörsch · begonnen am 11. Jan 2007 · letzter Beitrag vom 11. Jan 2007
Antwort Antwort
Benutzerbild von yörsch
yörsch

Registriert seit: 10. Jan 2007
Ort: Lampertheim
206 Beiträge
 
Delphi XE2 Architect
 
#1

DLL Aufruf (void**)&aImgFormat nach Delphi

  Alt 11. Jan 2007, 07:22
Hallo Zusammen,

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

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

Gruß
Jörg
Jörg
have FUN
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#2

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

  Alt 11. Jan 2007, 07:26
& bedeutet, dass du die Speciheradresse der Variablen ansprichst.

Das Umcasten nach void** brauchst du unter Delphi nicht.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#3

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

  Alt 11. Jan 2007, 08:11
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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Benutzerbild von yörsch
yörsch

Registriert seit: 10. Jan 2007
Ort: Lampertheim
206 Beiträge
 
Delphi XE2 Architect
 
#4

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

  Alt 11. Jan 2007, 08:47
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
Jörg
have FUN
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#5

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

  Alt 11. Jan 2007, 08:54
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.

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

function FX_GetCapability(iCamId: Integer; eCap: eBCAMQUERYCAP; iIdent: Integer; var ppCap: Pointer; var piCapNumber: Integer): DWORD; stdcall;
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#6

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

  Alt 11. Jan 2007, 08:59
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von yörsch
yörsch

Registriert seit: 10. Jan 2007
Ort: Lampertheim
206 Beiträge
 
Delphi XE2 Architect
 
#7

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

  Alt 11. Jan 2007, 09:08
Ja OK, sorry...

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


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 !!!!

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
Jörg
have FUN
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

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

  Alt 11. Jan 2007, 12:59
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 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.
  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 03:00 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