C Header nach Pascal - theimagesource

Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

C Header nach Pascal - theimagesource

Beitrag von af0815 »

Hallo,

ich bin dabei meine erste C-Header to Pascal übersetzung zu machen :-) und bin mir bei folgende Konstrukt ganz einfach nicht sicher.

Code: Alles auswählen

 
......
typedef struct HGRABBER_t__ { int unused; } HGRABBER_t; ///<Internal structure of the grabber object handle.
 
#define   HGRABBER HGRABBER_t* ///< Type of grabber object handle. Used for all functions.
 
#define AC __stdcall ///< __stdcall for Borland C and Ansi C
 
.....
 
HGRABBER AC IC_CreateGrabber();///<Create a new grabber handle
void AC IC_ReleaseGrabber( HGRABBER *hGrabber ); ///< Release an HGRABBER object.
 
int AC IC_OpenVideoCaptureDevice( HGRABBER hGrabber, char *szDeviceName ); ///< Opens a video capture device.
void AC IC_CloseVideoCaptureDevice( HGRABBER hGrabber ); ///<Closes a video capture device.
 
 


Ich habe das für mich einmal folgend übersetzt

Code: Alles auswählen

 
  type
    PGRABBER = ^TGRABBER;
    TGRABBER = record
        unused : longint;
      end;
 
  function IC_CreateGrabber:PGRABBER;cdecl;external External_library name 'IC_CreateGrabber';
  procedure IC_ReleaseGrabber(var hGrabber:PGRABBER);cdecl;external External_library name 'IC_ReleaseGrabber';
 
  function IC_OpenVideoCaptureDevice(var hGrabber:TGRABBER; szDeviceName:Pchar):longint;cdecl;external External_library name 'IC_OpenVideoCaptureDevice';
  procedure IC_CloseVideoCaptureDevice(var hGrabber:TGRABBER);cdecl;external External_library name 'IC_CloseVideoCaptureDevice';
 


Ist das korrekt ? Ich habe beim Testen ein Problem mit IC_ReleaseGrabber, der wirft mir einen SIGSEGV. Jetzt wollte ich mal nachfragen ob ich da wo auf dem Holzwege bin.

Code: Alles auswählen

 
var
  pGr : ^TGRABBER;
 
begin
  if (IC_InitLibrary(pchar('')) = IC_SUCCESS) then begin
    pGr := IC_CreateGrabber;
    if (IC_OpenVideoCaptureDevice(pGr^,'XXX xxxxxx') = IC_SUCCESS ) then begin
     .....
      IC_CloseVideoCaptureDevice(pGr^);
    end;
    IC_ReleaseGrabber(pGr); // <--- hier
    IC_CloseLibrary;
  end
  else
    showmessage('Initlibrary fail');
 




BTW: Ich bin dabei von theimagesource die DLL zum einbinden von GigE-Kameras in Lazarus zu bringen. Testen kann man das nur mit der entsprechenden Hardware (leider).

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: C Header nach Pascal - theimagesource

Beitrag von mse »

Code: Alles auswählen

 
#define AC __stdcall ///< __stdcall for Borland C and Ansi C
 

und

Code: Alles auswählen

 
void AC IC_ReleaseGrabber( HGRABBER *hGrabber ); ///< Release an HGRABBER object.
  procedure IC_ReleaseGrabber(var hGrabber:PGRABBER);cdecl; <<<---
   external External_library name 'IC_ReleaseGrabber';
 

Widersprechen sich. Wobei bei 64 bit die Aufrufkonventions-Definitionen AFAIK ignoriert werden
Ich würde grundsätzlich die gleichen Bezeichner wie in C verwenden:

Code: Alles auswählen

 
type
 TGRABBER = record
  unused: cint;
 end;
 HGRABBER = ^TGRABBER;
 PHGRABBER = ^HGRABBER;
 
  function IC_CreateGrabber(): HGRABBER; stdcall; external External_library name 'IC_CreateGrabber';
  procedure IC_ReleaseGrabber(Grabberpo: PHGRABBER); stdcall; external External_library name 'IC_ReleaseGrabber';
 
  function IC_OpenVideoCaptureDevice(Grabber: HGRABBER; szDeviceName: Pcchar): cint; stdcall; external External_library name 'IC_OpenVideoCaptureDevice';
  procedure IC_CloseVideoCaptureDevice(Grabber: HGRABBER); stdcall; external External_library name 'IC_CloseVideoCaptureDevice';
 
var
  grabber : HGRABBER;
 
begin
  if (IC_InitLibrary(pchar('')) = IC_SUCCESS) then begin
    grabber:= IC_CreateGrabber();
    if (IC_OpenVideoCaptureDevice(grabber,'XXX xxxxxx') = IC_SUCCESS ) then begin
     .....
      IC_CloseVideoCaptureDevice(grabber);
    end;
    IC_ReleaseGrabber(@grabber);
    IC_CloseLibrary();
  end
  else
    showmessage('Initlibrary fail');
 
 

Ungeprüft!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: C Header nach Pascal - theimagesource

Beitrag von af0815 »

mse danke.

Es sind oft die 'kleinen' Sachen, die man auch beim zig malen hinsehen übersieht. Mal sehen ob das Beispiel jetzt funktioniert.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten