![]() |
Konvertierungsproblem C++/VB nach Delphi. Buffer als var Parameter in/aus DLL
Hallo...
Ich beiss mir grad die Zähne an ner VB-Übersetzung aus.
Code:
Private Declare Function MCardGetAttrib Lib "MCSCM.DLL" (ByVal hMCardContext As Long, ByVal dwAttrId As Long, ByVal pbAttr As String, ByRef pcbAttrLen As Long) As Long
[..] Dim S As String Dim lSize As Long Dim lReturn As Long S = String(100, 0) lSize = 4 lReturn = MCardGetAttrib(hMCardContext, dwAttrId, S, lSize)
Delphi-Quellcode:
Die Fehlermeldung für MCardGetAttrib aus der DLL lautet "Invalid Parameter".
function MCardGetAttrib(hMCardContext: THandle; dwAttrId: Integer; pbAttr: PAnsiChar; var pcbAttrLen: Integer): Integer; stdcall; external 'MCSCM.DLL';
[..] var Return: Integer; s: AnsiString; size: Integer; [..] s := DupeString(Chr(0), 100); size:=4; Return:=MCardGetAttrib(hMCardContext, MCARD_ATTR_TYPE, PAnsiChar(s), size); Die Verwendung von PAnsiChar hat an anderer Stelle schon mal geklappt. Aber hier vermute ich, dass es Probleme mit den Nullchars gibt. Wie geht man hier vor? Hoffe jemand hat ne zündende Idee. Gruß, Toni |
AW: Konvertierungsproblem, VB - String an DLL übergeben
PAnsiChar? Kann es sein das PWideChar's erwartet werden?
|
AW: Konvertierungsproblem, VB - String an DLL übergeben
|
AW: Konvertierungsproblem, VB - String an DLL übergeben
Widestring führte mich nicht weiter...
Ich hab die Zeit aber genutzt und noch ein c++ Beispeil für das selbe Problem gefunden. Dort schaut es so aus:
Code:
Als erstes ist mir aufgefallen, dass im VB Code ein ByVal verschütt gegangen ist. Das lässt mich ja jetzt ein bissel an der ganzen Implementation zweifeln. Aber von C++ hab ich noch weniger Ahnung als von VB. Da wird fleißig gepointert. :(
typedef LONG (WINAPI *pfnMCardGetAttrib) (IN MCARDHANDLE hMCard, IN DWORD dwAttrId, OUT LPBYTE pbAttr, IN OUT LPDWORD pcbAttrLen);
[..] BYTE abyAttr [100]; DWORD dwLen; MCardGetAttrib (CardHandle, MCARD_ATTR_TYPE, abyAttr, &dwLen); |
AW: Konvertierungsproblem, VB - String an DLL übergeben
hilft Dir das weiter ?
TSCardSetAttrib = function (hCard: LongInt; dwAttrId: LongInt; var pbAttr: PByte; cbAttrLen: LongInt): LongInt; stdcall; |
AW: Konvertierungsproblem, VB - String an DLL übergeben
Ja, das kommt dem schon recht nahe was ich da intuitiv, also ohne genau zu wissen was ich tue, draus gemacht hab. Aber egal wie ich den Aufruf mache, ich erhalte immer "Invalid Parameter"
Delphi-Quellcode:
function MCardGetAttrib(hMCardContext: THandle; dwAttrId: Integer; var pbAttr: PByte; var pcbAttrLen: PDWord): Integer; stdcall; external 'MCSCM.DLL';
[..] byArray: array [0..99] of Byte; [..] for i := 0 to 99 do byArray[i]:=$00; size:=4; Return:=MCardGetAttrib(hMCardContext, MCARD_ATTR_TYPE, PByte(byArray), PDWord(size)); [Edit]Hab auch die offizielle Doku ergoogelt ![]() Toni |
AW: Konvertierungsproblem, VB - String an DLL übergeben
Mir kommt grad was in den Sinn. Ist dies viellecht das in C durchaus übliche Verfahren einen Buffer und dessen länge zu übergeben und dann den Rückgabewert im selben Buffer (als var also) zurück zu bekommen?
Aus der Doku:
Code:
Wenn dem so ist gibts doch hier bestimmt nen Spezialisten, der sowas schon mal gemacht hat, oder?
MCARD_FEATURES MCardFeatures;
DWORD dwLen; LONG lReturn; lReturn = MCardGetAttrib (hMCard, MCARD_ATTR_FEATURES, (unsigned char *) &MCardFeatures, &dwLen ); Toni |
AW: Konvertierungsproblem C++/VB nach Delphi. Buffer als var Parameter in/aus DLL
Dieser C-Header ist das was die meisten dir sicher am ehesten hätten übersetzen können:
Code:
Da ist es auch richtig beschrieben das pcbAttrLen einen gültigen Wert haben muss der übergeben wird und die Rückgabe auch über diese Variable erfolgt.
LONG McardGetAttrib (
IN MCARDHANDLE hMCard, IN DWORD dwAttrId, OUT LPBYTE pbAttr, IN OUT LPDWORD pcbAttrLen ); Die Delphi Übersetzung müsste dann meiner Meinung nach so aussehen:
Delphi-Quellcode:
Wobei ich mir bei StdCall nicht sicher bin da es nirgens vermerkt ist. Es könnte ebenso der C-Standard sein der dann cdecl entspricht.
Long McardGetAttrib(hMCard: Cardinal; dwAttrId: DWORD; var pbAttr: Byte; var pcbAttrLen: DWORD); stdcall;
Edit: einfacher Arbeiten lässt es sich aber mit folgender Übersetzung:
Delphi-Quellcode:
Denn da pbAttr als untypisierter Pointer declariert ist, braucht man nicht erst zu casten wenn man einen Pointer auf eine Struktur etc. hat, abhängig davon was man per dwAttrId anfordert.
Long McardGetAttrib(hMCard: Cardinal; dwAttrId: DWORD; pbAttr: Pointer; var pcbAttrLen: DWORD); stdcall;
Edit: Zitat:
|
AW: Konvertierungsproblem C++/VB nach Delphi. Buffer als var Parameter in/aus DLL
Okay, jetzt bin ich vollends verwirrt, denn das deckt sich so garnicht mit dem was ich bisher herausgefunden zu haben glaubte. :P
Okay, size (also pcbAttrLen) wird auf 4 gesetzt. Ich erwarte also 4 Byte, ja? Oder interprätiere ich das falsch? Auch der weiterführende Code (hab den noch nicht gepostet, weil ich den schon übersetzt hab) ließt offenbar die ersten 4 Bytes. Wie geht denn das mit "var pbAttr: Byte"? Versteh mich nicht falsch, bin immer bereit meinen Horizont zu erweitern. Zumal ich auf diesem Gebiet noch nicht viel Erfahrung hab und auch mit Pointern arbeite ich bisher eher "nach Gefühl". StdCall hab ich geraten. Klappt bei einigen anden Init-Aufrufen aus der selben DLL. Bekomme Handles zurück und die DLL Version. Die Handles scheinen gültig zu sein wenn ich sie wiederum an die DLL zurückgebe. Der Rückgabewert der Funktion ist ein Cardinal. Den Fehlercode MCARD_E_INVALID_PARAMETER hab ich aus der Doku bzw Original-Code. Die Messagebox baue ich selbst in einem bereits funktionsfähig übersetzten Teil des Codes. Zu deiner Übersetzung des Headers bekomm ich irgendwie grad keinen sinnvollen Aufruf gebaut. Toni |
AW: Konvertierungsproblem C++/VB nach Delphi. Buffer als var Parameter in/aus DLL
Hast du schon mal
![]() Dort findet sich
Delphi-Quellcode:
Function MCardGetAttrib(
hMCardContext:longint; dwAttrId:longint; pbAttr:String; var pcbAttrLen:longint):longint stdcall; external 'MCSCM.DLL'; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:30 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-2025 by Thomas Breitkreuz