Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C++ DLL in Delphi (https://www.delphipraxis.net/161920-c-dll-delphi.html)

mcbain 27. Jul 2011 12:56

C++ DLL in Delphi
 
Hallo,
ich nutze eine C++ DLL in Delphi, um meinen Ausweisdrucker fernzusteuern.
In der SDK Beschreibung sind die C++ Funktionen beschrieben.
Folgende Funktion funktioniert bspw.:

C++ Code
Code:
void ZBRPRNGetSDKVer(int *major,int *minor,int *engLevel)
Parameters:
major [out]pointer to major version number
minor [out]pointer to minor version number
engLevel [out]pointer to engineering level number

In Delphi nutze ich die Funktion dann bspw. so:
Code:
...
procedure ZBRPRNGetSDKVer(major, minor, engLevel: PInteger); stdcall; external 'ZBRPrinter.dll';
...

procedure TForm2.btnSDKClick(Sender: TObject);
var major, minor, engLevel: PInteger;
    a, b, c: integer;
begin
  major := @a;
  minor := @b;
  engLevel := @c;

  ZBRPRNGetSDKVsn(major,minor,engLevel);
end;

Aber folgendes funktioniert nicht:
C++ Code
Code:
int ZBRGetHandle(HANDLE *hPrinter,char *printerName,int *printerType,int *err)
Parameters:
hPrinter [out]pointer to returned printer driver handle
printerName [in] pointer to printer driver name
printerType [out]pointer to returned printer type value,
err [out]pointer to returned error code

Return Value:
TRUE successful
FALSE failed

In Delphi:
Code:
...
 function ZBRGetHandle(hPrinter: Phandle; printername: PChar;printerType, err: PInteger): Boolean; stdcall; external 'ZBRPrinter.dll';
...

procedure TForm2.btnSDKClick(Sender: TObject);
var hPrinter: Phandle;
    printerType, err: PInteger;
    printerName: Pchar;
begin

  printerName := 'Zebra P430i Card Printer USB';
  ZBRGetHandle(@hPrinter, printername , @printerType, @err)

end;
Kann mir jemand bitte erklären, warum ich da immer den Fehlercode (in @err) zurückbekomme, dass er den Handle auf den Drucker nicht hinbekommt? Was mache ich falsch? Der Drucker heißt definitiv so.

Wäre nett, wenn mir jemand weiterhelfen könnte, vielen Dank.
Gruß
mc

DeddyH 27. Jul 2011 13:13

AW: C++ DLL in Delphi
 
@PHandle => Pointer auf Pointer. Klappt es, wenn Du das @ stehenlässt, aber hPrinter als THandle deklarierst? Übrigens musst DU AFAIK nicht alle Parameter als Pointer deklarieren, es müsste doch auch genügen, diese als Var-Parameter zu übergeben, oder irre ich mich?

mcbain 27. Jul 2011 13:22

AW: C++ DLL in Delphi
 
Danke für die Antwort.
Wenn ich es so deklariere:

Code:
  function ZBRGetHandle(var hPrinter: THandle; var printername: PChar; var printerType; var err: PInteger): boolean; stdcall; external 'ZBRPrinter.dll';
und dann so aufrufe:
Code:
ZBRGetHandle(hPrinter, printername , printerType, err)
Kommt ein Fehlercode heraus, der nicht existiert... Noch ne Idee evtl. :)?

DeddyH 27. Jul 2011 13:49

AW: C++ DLL in Delphi
 
Nein, ich meinte das so:
Delphi-Quellcode:
function ZBRGetHandle(hPrinter: Phandle; printername: PChar; var printerType, err: Integer): Boolean; stdcall; external 'ZBRPrinter.dll';
...

procedure TForm2.btnSDKClick(Sender: TObject);
var hPrinter: Thandle;
    printerType, err: Integer;
    printerName: Pchar;
begin

  printerName := 'Zebra P430i Card Printer USB';
  ZBRGetHandle(@hPrinter, printername , printerType, err)

end;

mcbain 27. Jul 2011 14:44

AW: C++ DLL in Delphi
 
Bringt mir den gleichen Fehlercode 61, "Unable to open handle to Zebra printer driver"....ich verstehs nicht...

brechi 27. Jul 2011 20:38

AW: C++ DLL in Delphi
 
sicher dass, das handel stimmt? Haette es ja eher mit cdecl versucht:

Delphi-Quellcode:
procedure ZBRPRNGetSDKVer(out major, minor, engLevel: Integer); cdecl; external 'ZBRPrinter.dll';
function ZBRGetHandle(out hPrinter: THandle; printername: PChar; out printerType, err: Integer): Integer; cdecl; external 'ZBRPrinter.dll';

mcbain 28. Jul 2011 07:31

AW: C++ DLL in Delphi
 
An dem cdecl lags auch nicht.
Ich habe es nun herausgefunden, es lag an der Dokumentation.
Die Funktion muss folgendermaßen aussehen:

Code:
function ZBRGetHandle(var hPrinter: PHandle; printername: LPSTR; var printerType: Integer; var err: Integer) : Integer;stdcall; external 'ZBRPrinter.dll';
Wichtig dabei war, dass printername ein LPSTR ist und nichts anderes. In der Dokumentation steht da nämlich etwas von char....

Vielen Dank für eure Antworten.


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