Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi XE2 übergabe an C DLL (https://www.delphipraxis.net/180904-xe2-uebergabe-c-dll.html)

Supergrobie 30. Jun 2014 09:04

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:
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';
So sah die Deklaration bisher aus.

Angesprochen habe ich es dann so:

Code:
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;
Was muss ich tun damit das in XE2 wieder funktioniert?

DANKE!

mkinzler 30. Jun 2014 09:09

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)) ...

DeddyH 30. Jun 2014 09:14

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';

Supergrobie 30. Jun 2014 09:31

AW: XE2 übergabe an C DLL
 
Shit Montag :(

Aktuell :
Code:
function StrToDLL(s : String) : PAnsiChar;
begin
  result := PAnsiChar(s);
end;
muss ich jetzt überall AnsiString nehmen anstelle von String ?

Neutral General 30. Jun 2014 09:32

AW: XE2 übergabe an C DLL
 
Zitat:

Zitat von Supergrobie (Beitrag 1263774)
Shit Montag :(

Aktuell :
Code:
function StrToDLL(s : String) : PAnsiChar;
begin
  result := PAnsiChar(s);
end;

Wenn schon:

Delphi-Quellcode:
function StrToDLL(s : String) : PAnsiChar;
begin
  result := PAnsiChar(AnsiString(s));
end;

DeddyH 30. Jun 2014 09:34

AW: XE2 übergabe an C DLL
 
Oder gleich
Delphi-Quellcode:
function StrToDLL(s : AnsiString) : PAnsiChar;
begin
  result := PAnsiChar(s);
end;

himitsu 30. Jun 2014 09:57

AW: XE2 übergabe an C DLL
 
Alles nicht

Zitat:

Delphi-Quellcode:
function StrToDLL(s : String) : PAnsiChar;
begin
  result := PAnsiChar(s);
end;

Totaler Schrott und das sollte auch der Debugger bemängeln. :warn: (zumindestens ab Delphi 2009)

Zitat:

Delphi-Quellcode:
function StrToDLL(s : String) : PAnsiChar;
begin
  result := PAnsiChar(AnsiString(s));
end;

Typmäßig OK, aber dennoch Schrott.

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:
function StrToDLL(s : AnsiString) : PAnsiChar;
begin
  result := PAnsiChar(s);
end;

Solange man einen AnsiString übergibt und solange man diesen AnsiString nicht mehr verändert und er auch immernoch existiert, kommt das
Delphi-Quellcode:
StrToDLL(MyStr)
auf ein
Delphi-Quellcode:
PAnsiChar(MyStr)
hinaus und die Funktion ist "nutzlos", aber benutzbar.

Ü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:
function StrToDLL(var s : AnsiString) : PAnsiChar;
deklariert und so eine AnsiString-Variable als Parameter erzwingt)

himitsu 30. Jun 2014 10:02

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:
CONST X: AnsiString
deklarieren, da sich im AnsiString auch die PAnsiChar-Struktur versteckt)

Und bei Out-Parametern, muß es sowieso zwingend ein AnsiString sein. :stupid:

Supergrobie 30. Jun 2014 10:40

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:
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;
erst nachdem ich diese Zeile weg lasse gehts...

sBIC := ' ';

Danke an Alle die mir die Augen geöffnet haben :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:59 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