AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Konvertierungsproblem C++/VB nach Delphi. Buffer als var Parameter in/aus DLL
Thema durchsuchen
Ansicht
Themen-Optionen

Konvertierungsproblem C++/VB nach Delphi. Buffer als var Parameter in/aus DLL

Ein Thema von Tonic1024 · begonnen am 24. Sep 2010 · letzter Beitrag vom 28. Sep 2010
Antwort Antwort
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#1

AW: Konvertierungsproblem C++/VB nach Delphi. Buffer als var Parameter in/aus DLL

  Alt 24. Sep 2010, 15:56
Dieser C-Header ist das was die meisten dir sicher am ehesten hätten übersetzen können:
Code:
LONG McardGetAttrib (
IN MCARDHANDLE hMCard,
IN DWORD dwAttrId,
OUT LPBYTE pbAttr,
IN OUT LPDWORD pcbAttrLen
);
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.

Die Delphi Übersetzung müsste dann meiner Meinung nach so aussehen:
Long McardGetAttrib(hMCard: Cardinal; dwAttrId: DWORD; var pbAttr: Byte; var pcbAttrLen: DWORD); stdcall; 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.

Edit:
einfacher Arbeiten lässt es sich aber mit folgender Übersetzung:
Long McardGetAttrib(hMCard: Cardinal; dwAttrId: DWORD; pbAttr: Pointer; var pcbAttrLen: DWORD); stdcall; 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.

Edit:
Zitat:
Die Fehlermeldung für MCardGetAttrib aus der DLL lautet "Invalid Parameter".
wie kommst du zu dieser Fehlermeldung? Erscheint ein Fehlerfenster? Dann laut Doku gibt es doch gar keinen Rückgabewert der "Invalid Parameter" lautet außer ich hab das in der pdf übersehen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's

Geändert von SirThornberry (24. Sep 2010 um 16:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#2

AW: Konvertierungsproblem C++/VB nach Delphi. Buffer als var Parameter in/aus DLL

  Alt 28. Sep 2010, 10:38
Okay, jetzt bin ich vollends verwirrt, denn das deckt sich so garnicht mit dem was ich bisher herausgefunden zu haben glaubte.

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
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Konvertierungsproblem C++/VB nach Delphi. Buffer als var Parameter in/aus DLL

  Alt 28. Sep 2010, 10:59
Hast du schon mal hier geschaut?

Dort findet sich
Delphi-Quellcode:
Function MCardGetAttrib(
  hMCardContext:longint;
  dwAttrId:longint;
  pbAttr:String;
  var pcbAttrLen:longint):longint stdcall; external 'MCSCM.DLL';
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#4

AW: Konvertierungsproblem C++/VB nach Delphi. Buffer als var Parameter in/aus DLL

  Alt 28. Sep 2010, 12:07
Klar hab ich das gesehen. Ist ja quasi auch der einzig sinnvolle Result einer Googlesuche und ich beschäftige mich schon so einige Stunden mit dem Problem.

Aber mit dem Wissen, dass ich mir die letzten 2 Tage in denen ich mich mit diesem Problem beschäftigt hab angeeignet hab, ließt sich der doch ein wenig anders als beim ersten mal.

Delphi-Quellcode:
function MCardGetAttrib(
    hMCard:THandle;
    dwAttrId: DWord;
    pbAttr: AnsiString;
    var pcbAttrLen: Integer
  ):Integer; stdcall; external 'MCSCM.DLL';
Dies führt in der Tat zum gewünschten Ergebnis *staun*. Es ist, wenn man so will, die Eins-zu-Eins Übersetzung der VB-Codes aus meinem ersten Post. Mir ist nicht ganz klar warum in pbAttr (obwohl nicht als var übergeben und kein pointer) tatsächlich das ergebnis enthält. Ich kann nur vermuten, dass der Autor sich zu Nutze gemacht hat, dass ein AnsiString intern ja schon ein Pointer ist. Wie zukunftssicher das ist kann ich nicht beurteilen.

Danke Omata für die "Rückkopplung", die mich letztlich zum Ziel führte. War wohl der klassische Fall von "Brett vorm Kopf".

Toni
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  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 21:06 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