![]() |
XE2 übergabe an C DLL
Langsam hab ich den Schweiß auf der Stirn. :-D
Bisher habe ich eine "externe" DLL die mit IBAN und BIC zurück liefert mit Delphi 2007 einfach per PCHAR ansprechen können. In den Rückgabe Strings hatte ich dann die richtigen Werte drin. Seit der Umstellung auf XE2 funktioniert das nicht mehr... Ich habe schon PAnsiString getestet. Irgendwie komm ich da nicht weiter weil ich auch diese ganze String zu Pointer zusammen mit Unicode nicht so ganz kapiere. Habe im Netz und im Forum schon gesucht bin aber zu keinem Sinnvollen Ergebnis gekommen. Für Hilfe wäre ich sehr dankbar!
Code:
So sah die Deklaration bisher aus.
function sevDTA_Init(sInit: PChar): LongInt; stdcall; external 'sevDTA20.DLL';
procedure sevDTA_Close(Handle: LongInt); stdcall; external 'sevDTA20.DLL'; function sevDTA_BLZFileDate(sDatum: PChar): LongInt; stdcall; external 'sevDTA20.DLL'; function sevSEPA_CalcIBAN(sBLZnr, sKto, sBIC, cIBAN : PChar) : LongInt; stdcall; external 'sevDTA20.DLL'; Angesprochen habe ich es dann so:
Code:
Was muss ich tun damit das in XE2 wieder funktioniert?
function Get_CalcIBAN(sBLZnr, sKtonto, sBIC: String): String;
var sIBAN : String; begin cobresult := ''; SetLength(IBAN, 30); IBAN := ' '; SetLength(sBIC, 12); sBIC := ' '; case sevSEPA_CalcIBAN(StrToDLL(sBlzNr), StrToDLL(sKtonto), StrToDLL(sBic), StrToDLL(sIBAN)) of ERR_SEPA_CALCIBAN_ERROR : result := ''; ERR_SEPA_CALCIBAN_WARNING : Begin result := IBAN;cobresult := sBIC; end; ERR_SEPA_CALCIBAN_NOUSAGE: result := ''; ERR_BLZ_WRONG_FORMAT: result := ''; ERR_BLZ_KTONR_WRONG: result := ''; ERR_BLZ_NOT_FOUND: result := ''; else begin result := sIBAN; cobresult := sBIC; end; end; end; DANKE! |
AW: XE2 übergabe an C DLL
Wie sieht StrToDLL() aus?
Delphi-Quellcode:
function Get_CalcIBAN(sBLZnr, sKtonto, sBIC: AnsString): AnsiString;
... case sevSEPA_CalcIBAN(PAnsiChar(sBlzNr), PAnsiChar(sKtonto), PAnsiChar(sBic), PAnsiChar(sIBAN)) ... |
AW: XE2 übergabe an C DLL
Außerdem:
Delphi-Quellcode:
function sevDTA_Init(sInit: PAnsiChar): LongInt; stdcall; external 'sevDTA20.DLL';
procedure sevDTA_Close(Handle: LongInt); stdcall; external 'sevDTA20.DLL'; function sevDTA_BLZFileDate(sDatum: PAnsiChar): LongInt; stdcall; external 'sevDTA20.DLL'; function sevSEPA_CalcIBAN(sBLZnr, sKto, sBIC, cIBAN : PAnsiChar) : LongInt; stdcall; external 'sevDTA20.DLL'; |
AW: XE2 übergabe an C DLL
Shit Montag :(
Aktuell :
Code:
muss ich jetzt überall AnsiString nehmen anstelle von String ?
function StrToDLL(s : String) : PAnsiChar;
begin result := PAnsiChar(s); end; |
AW: XE2 übergabe an C DLL
Zitat:
Delphi-Quellcode:
function StrToDLL(s : String) : PAnsiChar;
begin result := PAnsiChar(AnsiString(s)); end; |
AW: XE2 übergabe an C DLL
Oder gleich
Delphi-Quellcode:
function StrToDLL(s : AnsiString) : PAnsiChar;
begin result := PAnsiChar(s); end; |
AW: XE2 übergabe an C DLL
Alles nicht
Zitat:
Zitat:
Delphi legt hier eine lokale temporäre Variable an, wo der AnsiString reingeht, bevor PAnsiChar darauf angewendet wird. Und jetzt ratet mal, was mit dieser Variable und deren Speicher bei Funktionsende passiert? Richtig, der Zeiger ist futsch, da er auf was nicht mehr Existierendes zeigt. Zitat:
Delphi-Quellcode:
auf ein
StrToDLL(MyStr)
Delphi-Quellcode:
hinaus und die Funktion ist "nutzlos", aber benutzbar.
PAnsiChar(MyStr)
Übergibt man aber einen "anderen" String-Typen, dann war's das wieder und alles ist Schrott. (kann man nur etwas verhindern/eingränzen, indem man es als
Delphi-Quellcode:
deklariert und so eine AnsiString-Variable als Parameter erzwingt)
function StrToDLL(var s : AnsiString) : PAnsiChar;
|
AW: XE2 übergabe an C DLL
Entweder du verwendest AnsiStrings (zumindestens in deiner Funktion), oder castest alles vor Ort
Delphi-Quellcode:
.
PAnsiChar(AnsiString(xxx))
Und die Funktions-Header der DLL-Funktionen müssen natürlich auch PAnsiChar sein. (wenn das nur IN-Parameter sind, dann kann man sie notfalls auch einfach als
Delphi-Quellcode:
deklarieren, da sich im AnsiString auch die PAnsiChar-Struktur versteckt)
CONST X: AnsiString
Und bei Out-Parametern, muß es sowieso zwingend ein AnsiString sein. :stupid: |
AW: XE2 übergabe an C DLL
Ah OK! Wieder was gelernt!
Ich lasse den Schrott dann nun weg! Btw. der Compliler meckert nicht... Aber leider liefert es mir jetzt meinen leeren Mist zurück... Nachdem ich es dann komplett auf AnsiString umgestellt habe bekomme ich beim Aufruf der DDL Routine einen UAE :evil:
Code:
erst nachdem ich diese Zeile weg lasse gehts...
function Get_CalcIBAN(sBLZnr, sKtonto, sBIC: AnsiString): String;
var sIBAN : AnsiString; begin cobresult := ''; SetLength(IBAN, 30); IBAN := ' '; SetLength(sBIC, 12); sBIC := ' '; case sevSEPA_CalcIBAN(PAnsiChar(sBlzNr), PAnsiChar(sKtonto), PAnsiChar(sBic), PAnsiChar(sIBAN)) of ERR_SEPA_CALCIBAN_ERROR : result := ''; ERR_SEPA_CALCIBAN_WARNING : Begin result := IBAN;cobresult := sBIC; end; ERR_SEPA_CALCIBAN_NOUSAGE: result := ''; ERR_BLZ_WRONG_FORMAT: result := ''; ERR_BLZ_KTONR_WRONG: result := ''; ERR_BLZ_NOT_FOUND: result := ''; else begin result := sIBAN; cobresult := sBIC; end; end; end; sBIC := ' '; Danke an Alle die mir die Augen geöffnet haben :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 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