AGB  ·  Datenschutz  ·  Impressum  







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

DLL Schnitstelle

Ein Thema von hewy · begonnen am 10. Jul 2020 · letzter Beitrag vom 7. Aug 2020
Antwort Antwort
hewy

Registriert seit: 2. Aug 2006
Ort: Arni (Region Zürich) Schweiz
83 Beiträge
 
Delphi XE5 Enterprise
 
#1

AW: DLL Schnitstelle

  Alt 11. Jul 2020, 13:34
Also hier nochmal den ganzen Zusammenhang vielleicht habe ich mich auch nicht wirklich klar ausgedrückt.
Danke dass Ihr nochmals versuchst mich auf den Richtigen Weg zu führen!

Code:
/* 1: ---------- Das ist der C Code in der DLL ------------------------------------------------------- */
SE_API_IMPL(se_result_t, se_getCertificationId)(char **certificationId,
   uint32_t *certificationIdLength)
{
   SE_EXPORT_METHOD;

   return se_getCertificationIdEx(&g_se_ctx, certificationId, certificationIdLength);
}


/* 2: ---------- Das mein Delphi Aufruf (Schnittstelle) der DLL Funktion --------------------------- */
function se_getCertificationId(var certificationId: PAnsiChar; certificationIdLength: Cardinal): Cardinal; cdecl; external 'se-api-c.dll';

/* 3: ---------- Das mein Delphi Aufruf auf der DLL Schnittstellen funktion ------------------------ */
function SeGetCertificationId(var CertificationId: PAnsiChar): TSeReturnCode;
var
  CertificationIDLength: Cardinal;
begin
  CertificationIDLength:= 0;
  Result := TSeReturnCode(se_getCertificationID(CertificationID, CertificationIDLength));
     
     // Und hier ist CertificationID =nil

  if PCertificationID<>nil then
  begin
        ...
   ..
   .
VB Verwendet die gleiche DLL und bekommt einen Pointer und kann den Wert (CertificationID) abholen.
Mein Delphi Code nicht??
Also ist möglicherweise im oberen Bereich /* 2: ---- oder /* 3: ---- etwas falsch.
Heinrich Wyssen

Geändert von hewy (11. Jul 2020 um 13:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#2

AW: DLL Schnitstelle

  Alt 11. Jul 2020, 13:40
Entweder im Vorfeld einen ausreichend großen Puffer reservieren und dessen Länge übergeben oder zunächst die benötigte Länge zurückgeben lassen, entsprechenden Speicher reservieren und diesen samt seiner tatsächlichen Länge übergeben. Das erfordert dann 2 Aufrufe.
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
venice2
(Gast)

n/a Beiträge
 
#3

AW: DLL Schnitstelle

  Alt 11. Jul 2020, 14:04
Ich glaube du meinst.

Delphi-Quellcode:
  // Und hier ist CertificationID =nil

  if CertificationID <> nil then
  begin
        //...
  end
PCertificationID gibt es nicht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.556 Beiträge
 
Delphi 12 Athens
 
#4

AW: DLL Schnitstelle

  Alt 11. Jul 2020, 14:06
Zitat:
VB Verwendet die gleiche DLL und bekommt einen Pointer und kann den Wert (CertificationID) abholen.
Mein Delphi Code nicht??
Also ist möglicherweise im oberen Bereich /* 2: ---- oder /* 3: ---- etwas falsch.
siehe #19 und #16 ... k.A. was man da sonst noch sagen soll.

Das sind allgemeine Grundlagen, die fast überall gleich sind, weil Viele es so machen.


Ich hoffe nur jemand macht sein teures Wormlaufwerk nicht kaputt.
Quelle: https://xbaseforum.de/viewtopic.php?p=132766
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
hewy

Registriert seit: 2. Aug 2006
Ort: Arni (Region Zürich) Schweiz
83 Beiträge
 
Delphi XE5 Enterprise
 
#5

AW: DLL Schnitstelle

  Alt 11. Jul 2020, 14:09
Ja richtig danke für den Hinweis!
Sollte heissen:
if CertificationID <> nil then
begin
Heinrich Wyssen
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#6

AW: DLL Schnitstelle

  Alt 11. Jul 2020, 14:16
Einmal grundsätzlich: man übergibt 2 Parameter an die Funktion, die auch beide von der DLL überschrieben werden, Rückgabe ist ein Fehlercode. Daraus folgt, dass man auch beide Parameter als Var-Parameter deklarieren muss. Ich habe die Cryptovision-API gerade nicht zur Hand, aber mit ziemlicher Sicherheit gibt die Funktion im 2. Parameter entweder die Anzahl der tatsächlich geschriebenen Bytes des 1. Parameters zurück, oder falls dieser zu knapp dimensioniert ist, die Anzahl der benötigten Bytes. Man kann nun also die benötigten Bytes ermitteln, indem man die Funktion mit den Werten nil für den PAnsiChar und 0 für die Länge übergibt. Anschließend wertet man die zurückgegebene Länge (deshalb Var-Parameter) aus, reserviert entsprechenden Speicher und übergibt diesen dann wie vorhin schon einmal erwähnt.
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
hewy

Registriert seit: 2. Aug 2006
Ort: Arni (Region Zürich) Schweiz
83 Beiträge
 
Delphi XE5 Enterprise
 
#7

AW: DLL Schnitstelle

  Alt 11. Jul 2020, 14:24
Heiii danke DeddyH das war das Problem.

function se_getCertificationId(var certificationId: PAnsiChar; certificationIdLength: Cardinal): Cardinal; cdecl; external 'se-api-c.dll';
Geändert zu:
function se_getCertificationId(var certificationId: PAnsiChar; var certificationIdLength: Cardinal): Cardinal; cdecl; external 'se-api-c.dll';

Und schon funzt alles.
Viele Dank. Auch an alle Andern die an meiner 30 Jährigen Delphi Erfahrung gezweifelt haben.

Heiri
Heinrich Wyssen
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#8

AW: DLL Schnitstelle

  Alt 11. Jul 2020, 14:29
Ja, immer diese dummen Sternchen in C, die kann man leicht übersehen
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
TiGü
Online

Registriert seit: 6. Apr 2011
Ort: Berlin
3.079 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: DLL Schnitstelle

  Alt 12. Jul 2020, 12:43
Heiii danke DeddyH das war das Problem.

function se_getCertificationId(var certificationId: PAnsiChar; certificationIdLength: Cardinal): Cardinal; cdecl; external 'se-api-c.dll';
Geändert zu:
function se_getCertificationId(var certificationId: PAnsiChar; var certificationIdLength: Cardinal): Cardinal; cdecl; external 'se-api-c.dll';

Und schon funzt alles.
Viele Dank. Auch an alle Andern die an meiner 30 Jährigen Delphi Erfahrung gezweifelt haben.

Heiri
Meine Güte, da guckt man auf'n Sonntagmittag in den Thread, sieht ein Haufen Im-Kreis-Gewixe um unwichtige Details und Nichtigkeiten, nur um dann festzustellen, dass die RICHTIGE Lösung aus Beitrag Nummer ZWEI (Hinweis: Translation Nr. 2) schließlich auf der DRITTEN Seite von jemand anderen nochmal gefunden/kopiert wurde.

Hewy, dreißig Jahre Delphi-Erfahrung sind zwar gut und schön, aber mit dreißig Sekunden erhöhtem Leseverständnisses und/oder stumpfen Ausprobieren meiner Vorschläge hätte viel Zeit und Nerven aller Beteiligten gespart werden können.

Geändert von TiGü (12. Jul 2020 um 16:18 Uhr)
  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 09:10 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