AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

C++ DLL in Delphi

Ein Thema von mcbain · begonnen am 27. Jul 2011 · letzter Beitrag vom 28. Jul 2011
Antwort Antwort
mcbain

Registriert seit: 18. Mai 2011
50 Beiträge
 
#1

C++ DLL in Delphi

  Alt 27. Jul 2011, 12:56
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: C++ DLL in Delphi

  Alt 27. Jul 2011, 13:13
@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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mcbain

Registriert seit: 18. Mai 2011
50 Beiträge
 
#3

AW: C++ DLL in Delphi

  Alt 27. Jul 2011, 13:22
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. ?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: C++ DLL in Delphi

  Alt 27. Jul 2011, 13:49
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mcbain

Registriert seit: 18. Mai 2011
50 Beiträge
 
#5

AW: C++ DLL in Delphi

  Alt 27. Jul 2011, 14:44
Bringt mir den gleichen Fehlercode 61, "Unable to open handle to Zebra printer driver"....ich verstehs nicht...
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#6

AW: C++ DLL in Delphi

  Alt 27. Jul 2011, 20:38
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';
  Mit Zitat antworten Zitat
mcbain

Registriert seit: 18. Mai 2011
50 Beiträge
 
#7

AW: C++ DLL in Delphi

  Alt 28. Jul 2011, 07:31
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:53 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