AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi C++ DLL / Konvertierung der Header-Datei nach Delphi
Thema durchsuchen
Ansicht
Themen-Optionen

C++ DLL / Konvertierung der Header-Datei nach Delphi

Ein Thema von Magickweis · begonnen am 23. Jun 2007 · letzter Beitrag vom 2. Jul 2007
Antwort Antwort
Seite 1 von 2  1 2      
Magickweis

Registriert seit: 23. Jun 2007
5 Beiträge
 
#1

C++ DLL / Konvertierung der Header-Datei nach Delphi

  Alt 23. Jun 2007, 18:02
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!?
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!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

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

  Alt 23. Jun 2007, 18:39
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
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#3

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

  Alt 24. Jun 2007, 05:14
Es ist ziemlich sicher das die Parameter nur auf genau ein Element zum ausfuellen zeigen, daher duerfte var die korrekte Aufrufart sein.
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.
  Mit Zitat antworten Zitat
Magickweis

Registriert seit: 23. Jun 2007
5 Beiträge
 
#4

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

  Alt 24. Jun 2007, 20:04
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
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#5

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

  Alt 25. Jun 2007, 04:24
Sieht kompliziert aus, bedetet aber nur das alle Funktionen die mit prCAPI deklariert sind den Rueckgabetyp prResponse haben und stdcall-Aufrufkonvention.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

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

  Alt 25. Jun 2007, 06:37
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Magickweis

Registriert seit: 23. Jun 2007
5 Beiträge
 
#7

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

  Alt 28. Jun 2007, 21:02
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.
  Mit Zitat antworten Zitat
Magickweis

Registriert seit: 23. Jun 2007
5 Beiträge
 
#8

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

  Alt 1. Jul 2007, 19:40
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!



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;
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

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

  Alt 1. Jul 2007, 19:45
Habe nur mal kurz drübergeguckt, sofort springt mir ins Auge:
Zitat:
ModuleName : Array [0..512] of Char;
Deine Arrays sind alle um eins zu lang. Nullbasierende Arrays gehen natürlich von 0 bis count-1.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#10

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

  Alt 2. Jul 2007, 04:22
Bitte nicht nach UInt64 abbilden. Das gibt es erst in den neueren Delphi-Versionen und selbst dort bereitet es Probleme. Ein Int64 genuegt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:35 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