Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi C++ DLL / Konvertierung der Header-Datei nach Delphi (https://www.delphipraxis.net/94582-c-dll-konvertierung-der-header-datei-nach-delphi.html)

Magickweis 23. Jun 2007 18:02


C++ DLL / Konvertierung der Header-Datei nach Delphi
 
Hallo zusammen,

arbeite gerade an einem Projekt bei dem es u.a. um die Fernsteuerung einer Digitalkamera vom Computer aus (über USB) geht. Ziel ist dabei das berührungsfreie Fotografieren von Objekten im medizinischen Bereich. Viele Kamerahersteller bieten entsprechende SDKs an, die allerdings üblicherweise nur C++/C# unterstützen. Um die entsprechenden DLLs nutzen zu können ist folglich eine Übersetzung der Header-Dateien nach Delphi notwendig.

Da C für mich eher eine Fremdsprache ist, habe ich dabei so meine Probleme. Testen geht momentan auch nicht so einfach, weil ich mir erst relativ sicher sein muss, das das Ganze letztendlich funktioniert, bevor ich mir dann eine entsprechende Kamera zulegen werde.

Könnte jetzt hier die .h-Files posten und hoffen das sich eine gute Seele erbarmt, möchte aber nicht dreist erscheinen und versuch's mal stattdessen mit gezielten Fragen.

1) Wie übersetzt man das Folgende?

Code:
prCAPI PR_CreateCameraObject(
   prDeviceInfoTable*   pDeviceInfo,
   prHandle*      pCameraHandle
);
Müsste so ähnlich aussehen...wobei die Pointer noch irgendwie eingebaut werden müssten!?
Delphi-Quellcode:
function PR_CreateCameraObject(pDeviceInfo : prDeviceInfoTable; pCameraHandle : prHandle) : prCAPI; stdcall; external 'prsdk.dll';
2) Übersetzung hierfür?

Code:
typedef prResponse prSTDCALL prRC_GetReleasedData(
   prHandle            CameraHandle,
   prObjectHandle      ObjectHandle,
   prptpEventCode      EventCode,
   prUInt32               TransSize,
   prContext      Context,
   prGetFileDataCB*   pGetFileDataCB
);
Danke für Eure Bemührungen!

marabu 23. Jun 2007 18:39

Re: C++ DLL / Konvertierung der Header-Datei nach Delphi
 
Herzlich willkommen in der Delphi-PRAXiS, Magickweis.

Bevor du dich unnötig quälst - hast du schon HEADCONV ausprobiert?

Project JEDI - Converting APIs

Freundliche Grüße

Robert Marquardt 24. Jun 2007 05:14

Re: C++ DLL / Konvertierung der Header-Datei nach Delphi
 
Es ist ziemlich sicher das die Parameter nur auf genau ein Element zum ausfuellen zeigen, daher duerfte var die korrekte Aufrufart sein.
Delphi-Quellcode:
function PR_CreateCameraObject(var DeviceInfo: prDeviceInfoTable; var CameraHandle : prHandle) : prCAPI; stdcall; external 'prsdk.dll';
Die andere Funktion ist eher noch einfacher, da dr letzte Parameter eine Callback ist. Das sieht man am Namensbestandteil CB.
In diesem Fall entfaellt der Pointer-Anteil der Deklaration, da Delphi das schon implizit im Funktionsparameter enthaelt. Es muss also nur prGetFileDataCB richtig deklariert werden.

Magickweis 24. Jun 2007 20:04

Re: C++ DLL / Konvertierung der Header-Datei nach Delphi
 
Hallo marabu und Robert,

vielen Dank für Eure Antworten. Ja, HeadConv kenne ich - funktioniert insofern, als das es einem die "monkey work" abnimmt, d.h. die einfachen Konversionen erledigt (Konstanten u.ä.). An Komplizierterem scheitert das Progrämmchen allerdings leider.

So muss ich mich dann irgendwie so durchkämpfen. Schon ärgerlich, daß Canon das SDK nur für C anbietet. Für deren Programmierer wär's ein Aufwand von schätzungsweise 10 Minuten gewesen und unsereins rauft sich sämtliche Haare aus.

Schon wieder stehe ich vor einem Rätsel:

Code:
#ifdef PRSDK_EXPORT
#define prCAPI prResponse __declspec(dllexport) prSTDCALL
#else
#define prCAPI prResponse __declspec(dllimport) prSTDCALL
#endif

Robert Marquardt 25. Jun 2007 04:24

Re: C++ DLL / Konvertierung der Header-Datei nach Delphi
 
Sieht kompliziert aus, bedetet aber nur das alle Funktionen die mit prCAPI deklariert sind den Rueckgabetyp prResponse haben und stdcall-Aufrufkonvention.

Luckie 25. Jun 2007 06:37

Re: C++ DLL / Konvertierung der Header-Datei nach Delphi
 
Zitat:

Zitat von Magickweis
Für deren Programmierer wär's ein Aufwand von schätzungsweise 10 Minuten gewesen und unsereins rauft sich sämtliche Haare aus.

Nicht wenn sie kein Delphi können. ;) Und da C eine universelle Sprache ist, die jeder Windows Programmierer zu mindest verstehen sollte, da das Betriebssystem in C geschrieben ist, liegen die Header eben nur in C vor. ;)

Magickweis 28. Jun 2007 21:02

Re: C++ DLL / Konvertierung der Header-Datei nach Delphi
 
Einstweilen danke für Eure konstruktiven Beiträge! Bin noch nicht ganz sicher, ob ich das letztendlich fehlerfrei hinbekommen werden, auf jeden Fall hilft mir das schon mal weiter. Muss mir wohl von irgendwoher 'ne entsprechende Kamera besorgen um erste praktische Tests durchführen zu können.

Magickweis 1. Jul 2007 19:40

Re: C++ DLL / Konvertierung der Header-Datei nach Delphi
 
Ich schon wieder - jaja, mühsam ernährt sich das Eichhörnchen. Ich bitte einen Fachkundigen kurz einen Blick auf folgende Konversionen zu werfen. Ist das so korrekt? Danke!

:coder2:

P.S.: Sollte die Übersetzung der Header-Files gelingen, werde ich selbstverständlich das ganze hier der Allgemeinheit zur Verfügung stellen - könnte ja sein, daß noch jemand seine Canon Powershot mit Delphi ansteuern möchte.

1)

Code:
typedef void      prVoid;
typedef unsigned char   prUInt8;
typedef   char      prInt8;
typedef char      prChar;
#ifndef macintosh
typedef unsigned short   prWChar;
#endif
typedef unsigned short   prUInt16;
typedef short      prInt16;
typedef unsigned long   prUInt32;
typedef long      prInt32;
typedef float      prFloat32;
#ifdef macintosh
typedef UInt64      prUInt64;
#else
typedef unsigned __int64 prUInt64;
#endif
typedef prUInt32   prResponse;
typedef prUInt16   prBoolean;
typedef prUInt32   prTime;
typedef prUInt32   prEventID;
typedef prUInt32   prContext;

#ifdef macintosh
typedef FSSpec      prFSSpec;
#endif

#ifdef macintosh
typedef prUInt32    prHWND;
#else   
typedef HWND      prHWND;
#endif
typedef prUInt32   prHandle;
typedef prUInt32   prObjectHandle;
Delphi-Quellcode:
type
  prUInt8               = Byte;
  prInt8                = Char;
  prChar               = Char;
  prWChar              = Word;
  prUInt16              = Word;
  prInt16               = SmallInt;
  prUInt32              = LongWord;
  prInt32               = LongInt;
  prFloat32             = Single;
  prUInt64              = UInt64;
  prResponse           = prUInt32;
  prBoolean            = prUInt16;
  prTime               = prUInt32;
  prEventID            = prUInt32;
  prContext            = prUInt32;
  prHWND               = HWND;
  prHandle             = prUInt32;
  prObjectHandle       = prUInt32;
--------------------------------------------------------

2)

Code:
typedef struct{
   prWChar ModuleName[512];            /* Module name (512 characters)   */
   prWChar Version[32];               /* Version (32 characters) */
}prVerInfo;

typedef struct{
   prUInt32  Entry;                  /* Number of modules included in this structure */
   prVerInfo VerInfo[prANY];             /* Array of file version number information of PS-ReC SDK modules */
}prDllsVerInfo;

typedef struct{
   prWChar          DeviceInternalName[512];   /* Internal devicve name (512 characters) */
   prWChar            ModelName[32];            /* Camera model name (32 characters) */
   prUInt16         Generation;            /* Camera generation number */
   prUInt32        Reserved1;            /* Reserved */
   prUInt32         ModelID;               /* Camera model ID */
   prUInt16        Reserved2;            /* Reserved */
   prPorttype         PortType;               /* Port type 0x01�FWIA / 0x02�FSTI */
   prUInt32        Reserved3;            /* Reserved */
}prDeviceInfoTable;

typedef struct{
   prUInt32   NumList;               /* Number of camera device information included in this structure */
   prDeviceInfoTable DeviceInfo[prANY];   /* Camera device information */
}prDeviceList;

typedef struct{
   prProgressMsg lMessage;               /* Message */
   prProgressSts lStatus;               /* Status */
   prUInt32     lPercentComplete;         /* The uint of this parameter is percent */
   prUInt32     lOffset;               /* Offset */
   prUInt32     lLength;               /* Size */
   prUInt32     lReserved;            /* Reserved */
   prUInt32     lResLength;            /* Reserved */
   prUInt8 *     pbData;               /* Pointer to the buffer in which the transferred data is stored. */
}prProgress;
Delphi-Quellcode:
type
  prVerInfo = packed record
    ModuleName : Array [0..512] of prWChar;
    Version   : Array [0..32] of prWChar;
  end;

  prDllsVerInfo = packed record
    Entry     : prUInt32;
    VerInfo   : Array [0..prANY] of prVerInfo;
  end;

  prDeviceInfoTable = packed record
    DeviceInternalName   : Array [0..512] of prWChar;
    ModelName      : Array [0..32] of prWChar;
    Generation      : prUInt16;
    Reserved1      : prUInt32;
    ModelID      : prUInt32;
    Reserved2      : prUInt16;
    PortType      : prPortType;
    Reserved3      : prUInt32;
  end;

  prDeviceList = packed record
    NumList      : prUInt32;
    DeviceInfo      : Array [0..prANY] of prDeviceInfoTable;
  end;

  prProgress = packed record
    lMessage      : prProgressMsg;
    lStatus      : prProgressSts;
    lPercentComplete   : prUInt32;
    lOffset      : prUInt32;
    lLength      : prUInt32;
    lReserved      : prUInt32;
    lResLength      : prUInt32;
    pbData      : prUInt8;
  end;
--------------------------------------------------------

3)

Code:
#define prSUB_GENERATION_CAMERA(gen)   ((gen&prGENERATION_CAMERA_MASK)>>8)
Delphi-Quellcode:
function prSUB_GENERATION_CAMERA(gen : Integer) : Integer;
begin
  prSUB_GENERATION_CAMERA := ((gen and prGENERATION_CAMERA_MASK) shr 8);
end;

Apollonius 1. Jul 2007 19:45

Re: C++ DLL / Konvertierung der Header-Datei nach Delphi
 
Habe nur mal kurz drübergeguckt, sofort springt mir ins Auge:
Zitat:

Delphi-Quellcode:
ModuleName : Array [0..512] of Char;

Deine Arrays sind alle um eins zu lang. Nullbasierende Arrays gehen natürlich von 0 bis count-1.

Robert Marquardt 2. Jul 2007 04:22

Re: C++ DLL / Konvertierung der Header-Datei nach Delphi
 
Bitte nicht nach UInt64 abbilden. Das gibt es erst in den neueren Delphi-Versionen und selbst dort bereitet es Probleme. Ein Int64 genuegt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:21 Uhr.
Seite 1 von 2  1 2      

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