C Header nach Pascal - theimagesource

C Header nach Pascal - theimagesource

Beitragvon af0815 » 18. Mär 2018, 11:39 C Header nach Pascal - theimagesource

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).
af0815
 
Beiträge: 3490
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon mse » 18. Mär 2018, 13:59 Re: C Header nach Pascal - theimagesource

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!
mse
 
Beiträge: 2009
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon af0815 » 18. Mär 2018, 15:08 Re: C Header nach Pascal - theimagesource

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).
af0815
 
Beiträge: 3490
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

• Themenende •

Zurück zu Windows



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried