Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL Schnitstelle (https://www.delphipraxis.net/204889-dll-schnitstelle.html)

hewy 11. Jul 2020 11:44

AW: DLL Schnitstelle
 
Danke vorerst mal an alle muss es mal ausprobieren die DLL Spricht mit einer Hardware, brauche für den Testaufbau zu aktivier etwas Zeit.

@Himitsu: Lässt sich so wie dargestellt Fehlerfrei Kompilieren die Initialisierung CertificationIDLength := 0; löst das Problem nicht hatte ich auch schon ausprobiert.

Der Vollständige VB Aufruf der einwandfrei funktioniert ist in meinem initial Post enthalten.
Dort wird Length auch nicht weitergereicht.

Melde mich dann wieder.

venice2 11. Jul 2020 11:52

AW: DLL Schnitstelle
 
Zitat:

Zitat von hewy (Beitrag 1469358)
Dort wird Length auch nicht weitergereicht.

Nein?
Irgendwie wiedersprüchlich.
Zitat:

// VB übergibt PCertificationID = &H000000000 und CertificationIDLength = 0
Ich weis nicht wie oft du mit Delphi bisher gearbeitet hast.
Aber diese Zeile ist unnötig
Delphi-Quellcode:
CertificationId := String(AnsiString(PCertificationID)); // Oder sehe ich das falsch?


Die Rückgabe der CertificationId ist schon in der Abfrage enthalten
Delphi-Quellcode:
Result := TSeReturnCode(se_getCertificationID(CertificationID, CertificationIDLength));


Denn CertificationID ist ein var parameter.

Wenn du die Funktion so aufrufst
Delphi-Quellcode:
if SeGetCertificationId(CertificationId, 0) = ExecutionOk then


dann befindet sich das Ergebnis in CertificationId.
Ok bin raus.

hewy 11. Jul 2020 13:00

AW: DLL Schnitstelle
 
Also die Ganze kette steht, so dass ich aktiv testen kann. Und ich habe Venice2 Vorschlag ausprobiert.

Delphi-Quellcode:
function SeGetCertificationId(var CertificationId: string): TSeReturnCode;
var
  PCertificationID: PAnsiChar;
  CertificationIDLength: Cardinal;
begin
  PCertificationID := nil;
  CertificationIDLength:= 0;
    // ################ Das kann Kompiliert werden Mein bisheriger Code!
  Result := TSeReturnCode(se_getCertificationID(PCertificationID, CertificationIDLength));
    // ////////////////// Das lässt sich so nicht kompilieren Venice2 Vorschlag! 
  Result := TSeReturnCode(se_getCertificationID(CertificationID, CertificationIDLength));
    Ergibt: [DCC Fehler] SeApi.pas(545): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
Den folgendes wird aufgerufen:
Code:
  function se_getCertificationId(var certificationId: PAnsiChar; certificationIdLength: Cardinal): Cardinal; cdecl; external 'se-api-c.dll';
Übrigens: >>> Ich weis nicht wie oft du mit Delphi bisher gearbeitet hast. <<< Sei doch froh dass sich jemand in Delphi weiter entwinkeln versucht,
und unterstürze die noch nicht experten das verhilft Delphi zum weiteren überleben.

Mein Problem ist damit leider noch nicht gelöst. Will ja keinem auf den Wecker gehen brauche lediglich eine Lösung auf die ich nicht selber komme.

Danke
Heiri

venice2 11. Jul 2020 13:09

AW: DLL Schnitstelle
 
Zitat:

Übrigens: >>> Ich weis nicht wie oft du mit Delphi bisher gearbeitet hast. <<< Sei doch froh dass sich jemand in Delphi weiter entwinkeln versucht,
und unterstürze die noch nicht experten das verhilft Delphi zum weiteren überleben.
Entschuldige aber du hast es immer noch nicht verstanden.

Delphi-Quellcode:
function SeGetCertificationId(var CertificationId: PAnsiChar): TSeReturnCode;
var
  //PCertificationID: PAnsiChar; nicht nötig
  CertificationIDLength: Cardinal;
begin
  // PCertificationID := nil; nicht nötig
  CertificationIDLength:= 0;

  Result := TSeReturnCode(se_getCertificationID(CertificationId, CertificationIDLength));
end;
Vergleiche meinen und deinen Code.
Die Rückgabe ist PAnsiChar und nicht string. siehe (Wie oft habe ich das jetzt schon gesagt? )

Zitat:

Den folgendes wird aufgerufen:
function se_getCertificationId(var certificationId: PAnsiChar; certificationIdLength: Cardinal): Cardinal; cdecl; external 'se-api-c.dll';

Zitat:

// ////////////////// Das lässt sich so nicht kompilieren Venice2 Vorschlag!
Schon wenn man es richtig macht.
Ich sagte PAnsiChar aber du hast immer noch den String in deiner Funktion.
Und dieser Type muss gleich sein bei einem var Parameter.

Daniel 11. Jul 2020 13:21

AW: DLL Schnitstelle
 
Ja, und das geht bestimmt auch etwas weniger schroff, oder?

himitsu 11. Jul 2020 13:22

AW: DLL Schnitstelle
 
bei APIs die man vorher nach der Länge fragt, entsprechend dem vom VB
Delphi-Quellcode:
var S: AnsiString;

S := '';
x := API(nil, 0);
Check(x);
SetLength(S, x);
Check(API(PAnsiChar(S), x));
Result := S;
oder eben nicht fragen, sondern einfach machen
Delphi-Quellcode:
var S: AnsiString; // oder array[0..MAX_LENGTH-1] of AnsiChar;

SetLength(S, MAX_LENGTH);
x := API(PAnsiChar(S), {Length(S)}MAX_LENGTH);
Check(x);
SetLength(S, x);
Result := S;
ich empfehle mal die Dokumentation von der Funktion zu lesen,
oder hier mal von Anderen, die auch sowas machen.
https://docs.microsoft.com/en-us/win...getwindowtexta
https://docs.microsoft.com/en-us/win...odulefilenamea

venice2 11. Jul 2020 13:23

AW: DLL Schnitstelle
 
Zitat:

Zitat von Daniel (Beitrag 1469365)
Ja, und das geht bestimmt auch etwas weniger schroff, oder?

Ich habe ihn wie oft darauf hingewiesen?
Sein Unverständnis dann auf mich abzuwälzen ist weniger schroff ?

hewy 11. Jul 2020 13:34

AW: DLL Schnitstelle
 
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.

DeddyH 11. Jul 2020 13:40

AW: DLL Schnitstelle
 
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.

venice2 11. Jul 2020 14:04

AW: DLL Schnitstelle
 
Ich glaube du meinst.

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

  if CertificationID <> nil then
  begin
        //...
  end
PCertificationID gibt es nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 Uhr.
Seite 2 von 4     12 34      

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