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. |
AW: DLL Schnitstelle
Zitat:
Irgendwie wiedersprüchlich. Zitat:
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. |
AW: DLL Schnitstelle
Also die Ganze kette steht, so dass ich aktiv testen kann. Und ich habe Venice2 Vorschlag ausprobiert.
Delphi-Quellcode:
Den folgendes wird aufgerufen:
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
Code:
Übrigens: >>> Ich weis nicht wie oft du mit Delphi bisher gearbeitet hast. <<< Sei doch froh dass sich jemand in Delphi weiter entwinkeln versucht,
function se_getCertificationId(var certificationId: PAnsiChar; certificationIdLength: Cardinal): Cardinal; cdecl; external 'se-api-c.dll';
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 |
AW: DLL Schnitstelle
Zitat:
Delphi-Quellcode:
Vergleiche meinen und deinen Code.
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; Die Rückgabe ist PAnsiChar und nicht string. siehe (Wie oft habe ich das jetzt schon gesagt? ) Zitat:
Zitat:
Ich sagte PAnsiChar aber du hast immer noch den String in deiner Funktion. Und dieser Type muss gleich sein bei einem var Parameter. |
AW: DLL Schnitstelle
Ja, und das geht bestimmt auch etwas weniger schroff, oder?
|
AW: DLL Schnitstelle
bei APIs die man vorher nach der Länge fragt, entsprechend dem vom VB
Delphi-Quellcode:
oder eben nicht fragen, sondern einfach machen
var S: AnsiString;
S := ''; x := API(nil, 0); Check(x); SetLength(S, x); Check(API(PAnsiChar(S), x)); Result := S;
Delphi-Quellcode:
ich empfehle mal die Dokumentation von der Funktion zu lesen,
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; 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 |
AW: DLL Schnitstelle
Zitat:
Sein Unverständnis dann auf mich abzuwälzen ist weniger schroff ? |
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:
VB Verwendet die gleiche DLL und bekommt einen Pointer und kann den Wert (CertificationID) abholen.
/* 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 ... .. . Mein Delphi Code nicht?? Also ist möglicherweise im oberen Bereich /* 2: ---- oder /* 3: ---- etwas falsch. |
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.
|
AW: DLL Schnitstelle
Ich glaube du meinst.
Delphi-Quellcode:
PCertificationID gibt es nicht.
// Und hier ist CertificationID =nil
if CertificationID <> nil then begin //... end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 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