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 Header -> Delphi (https://www.delphipraxis.net/98506-c-dll-header-delphi.html)

f.siebler 28. Aug 2007 11:50


C++ DLL Header -> Delphi
 
Moin Moin,


vll. bin ich heute morgen noch nicht ganz wach, aber irgenwie bekomme ich es nicht gebacken C++ Header Files nach Delphi zu übersetzten......

Anbei der Ausschnitt aus dem Header File.

Es wäre total super, wenn mir da jemand helfen könnte :-)

Besten Dank
Fabian

Delphi-Quellcode:

#ifndef _biometricdll_h
#define _biometricdll_h

#define   DLLIMPORT   extern "C" __declspec(dllimport)

//$e-----------------------------------------------------------------------------------------------
//   @GetSerialNumbers
//
//   Function   :   Lists all biometric devices plugged in the station.
//                  Reads all the serial numbers.
//
//   Inputs      :  pdwSerialNumberLength points to the buffer pbySerialNumbers total length.
//
//  Outputs    :  pbySerialNumbers points to the serial numbers
//                  pdwNbDevices points to the number of detected devices.
//
//  Returns      :   RCDone if the reading of all device serial numbers succeeded.
//               RCFailed if the operation failed.
//               RCNoDevice if there is no device.
//               RCOpenFailed if there is a problem while opening the device.
//               RCAllocationFailed if a dynamic allocation failed (lack of memory resource).
//
//  Info       :  Each serial number is a DWORD.
//                  pbySerialNumbers can be seen as a array of DWORD (DWORD[]).
//                  If you cast ( (DWORD*) ) pbySerialNumbers, you will obtain the same serial
//                  number as the one printed on the lower part of device (Sn : xxxxxxxx).
//$e-----------------------------------------------------------------------------------------------
DLLIMPORT DWORD GetSerialNumbers(BYTE * const pbySerialNumbers,
                                DWORD * const pdwSerialNumberLength,
                                DWORD * const pdwNbDevices);

SirThornberry 28. Aug 2007 11:52

Re: C++ DLL Header -> Delphi
 
an welchem Teil davon scheiterst du? Helfen heißt ja nicht das andere die Arbeit komplett machen sonder einen unterstützen.

nitschchedu 28. Aug 2007 11:54

Re: C++ DLL Header -> Delphi
 
Vieleicht so ;-)

Delphi-Quellcode:
function GetSerialNumbers(const pbySerialNumbers: PBYTE;
                                const PDWORD pdwSerialNumberLength;
                                const PDWORD pdwNbDevices): DWORD; cdecl; external 'die.dll';

SirThornberry 28. Aug 2007 11:57

Re: C++ DLL Header -> Delphi
 
jetzt hat er zwar seine Lösung (zwar nicht die Optimale) aber richtig viel lernt man nicht wenn man einfach die Komplettlösung bekommt ohne Erklärung.

Wenn man folgendes beachtet:
Zitat:

Each serial number is a DWORD.
pbySerialNumbers can be seen as a array of DWORD (DWORD[])
dann kann man da auch einen anderen Typ nehmen/erstellen welcher eben das bequeme zugreifen erleichtert.

f.siebler 28. Aug 2007 11:57

Re: C++ DLL Header -> Delphi
 
Moin,

sorry,

Delphi-Quellcode:
function GetSerialNumbers(pbySerialNumbers : byte; dwSerialNumberLength : DWord; pdwNbDevices : DWord ): DWord; cdecl; external 'BiometricDll.dll';
war der bisherige Code, wollte den Post nicht komplett mit meinen Versuchen zumüllen, mit dem "const" davor werde ich es mal versuchen! :-)

SirThornberry 28. Aug 2007 12:00

Re: C++ DLL Header -> Delphi
 
war fast richtig :)
der Stern hinter dem Datentyp bedeutet das es sich um den Pointertyp handelt.
Code:
BYTE *
wäre also ein Pointer auf ein Byte
Delphi-Quellcode:
type
  PByte = ^Byte;
unter Berücksichtigung des Kommentaares wäre aber folgendes das beste:

Delphi-Quellcode:
type
  TDWordArray = Array[0..0] of DWORD;
  PDWordArray = ^TDWordArray;
[...]
function GetSerialNumbers(const pbySerialNumbers: PDWordArray;
                                const PDWORD pdwSerialNumberLength;
                                const PDWORD pdwNbDevices): DWORD; cdecl; external 'die.dll';

nitschchedu 28. Aug 2007 12:07

Re: C++ DLL Header -> Delphi
 
Zitat:

Zitat von SirThornberry
jetzt hat er zwar seine Lösung (zwar nicht die Optimale) aber richtig viel lernt man nicht wenn man einfach die Komplettlösung bekommt ohne Erklärung.

Ja sorry stimmt schon .. wollte gerade Posten da hattes du vor mir gepostet, und da selbst noch übersetzten übe kamm mir das gelegen ^^.

OregonGhost 28. Aug 2007 12:07

Re: C++ DLL Header -> Delphi
 
Zitat:

Zitat von SirThornberry
Delphi-Quellcode:
type
  TDWordArray = Array[0..0] of DWORD;
  PDWordArray = ^TDWordArray;
[...]
function GetSerialNumbers(const pbySerialNumbers: PDWordArray;
                                const PDWORD pdwSerialNumberLength;
                                const PDWORD pdwNbDevices): DWORD; cdecl; external 'die.dll';

Warum nicht
Delphi-Quellcode:
function GetSerialNumbers(const pbySerialNumbers: PDWordArray;
                                var pdwSerialNumberLength: DWORD;
                                var pdwNbDevices: DWORD): DWORD; cdecl; external 'die.dll';
?

Edit: Oh, und noch eine Nachfrage in eigener Sache. Was bedeutet
Delphi-Quellcode:
const pbySerialNumbers: PDWordArray;
? Was genau ist konstant? In der C-Version sind nämlich in allen drei Fällen nur die Zeiger konstant, nicht jedoch der Inhalt.

f.siebler 28. Aug 2007 12:14

Re: C++ DLL Header -> Delphi
 
Das geht bei mir irgendwie nicht, (Er meckert die "pdwSerialNumberLength usw.." an, mit "( erwartet"


Delphi-Quellcode:
function GetSerialNumbers(const pbySerialNumbers: PDWordArray;
                                const PDWORD pdwSerialNumberLength;
                                const PDWORD pdwNbDevices): DWORD; cdecl; external 'die.dll';
aber das geht, klappt der Aufruf der Funktion leider noch nicht. Ich bekomme eine Exception.

Delphi-Quellcode:
function GetSerialNumbers(const pbySerialNumbers: PDWordArray;
                                const pdwSerialNumberLength : PDWORD;
                                const pdwNbDevices : PDWORD): DWORD; cdecl; external 'BiometricDll.dll';
Der Aufruf der Funktion erfolgt so:

Delphi-Quellcode:
var
  pdwSerialNumberLength, pdwNbDevices : PDWord;
  pbySerialNumbers : PDWordArray;
  res : Dword;
begin


  res := GetSerialNumbers(pbySerialNumbers, pdwSerialNumberLength, pdwNbDevices);

end

habe ich da jetzt irgendwas falsch verstanden? Ich steh leider irgendwie noch aufm schlauch... denn die anderen ca. 30 funktionen wollte ich später noch übersetzten ohne euch damit zu nerven :-)

Robert Marquardt 28. Aug 2007 12:21

Re: C++ DLL Header -> Delphi
 
Also die C-Deklaration der Funktion ist selten daemlich. "BYTE * const pbySerialNumbers" wird beschrieben als Zeiger auf DWORDs. Warum ist er dann nicht genau so deklariert? Die const-Angabe bei den Zeigern bedeutet das der Zeiger innerhalb der Funktion nicht veraendert werden kann, die Daten auf die er zeigt schon.

Delphi-Quellcode:
// pbySerialNumbers so deklarieren wie es der Kommentar sagt
function GetSerialNumbers(pbySerialNumbers: PDWORD;
  // hier funktioniert var am besten, auch wenn der Wert dem Kommentar nach nicht veraendert wird (noch so ein dummer Fehler, die Funktion koennte hier einen zu kleinen Puffer signalisieren)
  var dwSerialNumberLength: DWORD;
  // eindeutig ein Output-Parameter den man mit var oder out deklariert)
  var dwNbDevices: DWORD): DWORD; cdecl; external 'die.dll';

var
  Serials: array [0..79] of DWORD;
  LenSerials: DWORD;
  NumDevices: DWORD;
begin
  LenSerials := 80;
  NumDevices := 0;
  GetSerialNumbers(@[Serials[0], LenSerials, NumDevices);


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:38 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