AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

XE2 übergabe an C DLL

Ein Thema von Supergrobie · begonnen am 30. Jun 2014 · letzter Beitrag vom 30. Jun 2014
Antwort Antwort
Supergrobie

Registriert seit: 22. Okt 2003
Ort: Aachen
28 Beiträge
 
Delphi XE7 Professional
 
#1

XE2 übergabe an C DLL

  Alt 30. Jun 2014, 10:04
Langsam hab ich den Schweiß auf der Stirn.
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!
Stefan
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: XE2 übergabe an C DLL

  Alt 30. Jun 2014, 10:09
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)) ...
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: XE2 übergabe an C DLL

  Alt 30. Jun 2014, 10:14
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';
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
Supergrobie

Registriert seit: 22. Okt 2003
Ort: Aachen
28 Beiträge
 
Delphi XE7 Professional
 
#4

AW: XE2 übergabe an C DLL

  Alt 30. Jun 2014, 10:31
Shit Montag

Aktuell :
Code:
function StrToDLL(s : String) : PAnsiChar;
begin
  result := PAnsiChar(s);
end;
muss ich jetzt überall AnsiString nehmen anstelle von String ?
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: XE2 übergabe an C DLL

  Alt 30. Jun 2014, 10:32
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;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: XE2 übergabe an C DLL

  Alt 30. Jun 2014, 10:34
Oder gleich
Delphi-Quellcode:
function StrToDLL(s : AnsiString) : PAnsiChar;
begin
  result := PAnsiChar(s);
end;
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
Benutzerbild von himitsu
himitsu

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

AW: XE2 übergabe an C DLL

  Alt 30. Jun 2014, 10:57
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. (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 StrToDLL(MyStr) auf ein 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 function StrToDLL(var s : AnsiString) : PAnsiChar; deklariert und so eine AnsiString-Variable als Parameter erzwingt)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: XE2 übergabe an C DLL

  Alt 30. Jun 2014, 11:02
Entweder du verwendest AnsiStrings (zumindestens in deiner Funktion), oder castest alles vor Ort 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 CONST X: AnsiString deklarieren, da sich im AnsiString auch die PAnsiChar-Struktur versteckt)

Und bei Out-Parametern, muß es sowieso zwingend ein AnsiString sein.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Supergrobie

Registriert seit: 22. Okt 2003
Ort: Aachen
28 Beiträge
 
Delphi XE7 Professional
 
#9

AW: XE2 übergabe an C DLL

  Alt 30. Jun 2014, 11:40
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

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
Stefan

Geändert von Supergrobie (30. Jun 2014 um 13:23 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:14 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