![]() |
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:
Müsste so ähnlich aussehen...wobei die Pointer noch irgendwie eingebaut werden müssten!?
prCAPI PR_CreateCameraObject(
prDeviceInfoTable* pDeviceInfo, prHandle* pCameraHandle );
Delphi-Quellcode:
2) Übersetzung hierfür?
function PR_CreateCameraObject(pDeviceInfo : prDeviceInfoTable; pCameraHandle : prHandle) : prCAPI; stdcall; external 'prsdk.dll';
Code:
Danke für Eure Bemührungen!
typedef prResponse prSTDCALL prRC_GetReleasedData(
prHandle CameraHandle, prObjectHandle ObjectHandle, prptpEventCode EventCode, prUInt32 TransSize, prContext Context, prGetFileDataCB* pGetFileDataCB ); |
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 ![]() ![]() Freundliche Grüße |
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:
Die andere Funktion ist eher noch einfacher, da dr letzte Parameter eine Callback ist. Das sieht man am Namensbestandteil CB.
function PR_CreateCameraObject(var DeviceInfo: prDeviceInfoTable; var CameraHandle : prHandle) : prCAPI; stdcall; external 'prsdk.dll';
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. |
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 |
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.
|
Re: C++ DLL / Konvertierung der Header-Datei nach Delphi
Zitat:
|
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.
|
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; |
Re: C++ DLL / Konvertierung der Header-Datei nach Delphi
Habe nur mal kurz drübergeguckt, sofort springt mir ins Auge:
Zitat:
|
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 10:25 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 by Thomas Breitkreuz