Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   externes DLL bei Delphi XE (https://www.delphipraxis.net/159593-externes-dll-bei-delphi-xe.html)

Supergrobie 4. Apr 2011 15:46

externes DLL bei Delphi XE
 
Hallo!

Leider finde ich hierzu einfach keine Lösung.
Ich entwickle eine Datenbank Anwendung und nehme dazu ein DLL eines Fremdherstellers
zu Hilfe welches Bankleitzahlen und Kontonummern prüft.
Eigentlich wurde es für Basic entwickelt und lief bisher mit Delphi2006
einwandfrei.

Seit dem Umstieg auf XE macht es nur noch Mist. Übergebene Daten werden nur noch als
"unbekannt" zurückgegeben.

Ich denke es hängt mit der Unicode funktionalität zusammen. Leider kenne ich mich
mit PAnsiChar und PWideString usw. mal garnicht aus... :-(

Bisher war die Konfiguration so:
Delphi-Quellcode:
unit _Dta;

interface

uses StrUtils, sysUtils;

{Initialisierung + Beenden}
  function sevDTA_Init(sInit: PAnsiChar): LongInt; stdcall; external 'sevDTA32.DLL';
  procedure sevDTA_Close(Handle: LongInt); stdcall; external 'sevDTA32.DLL';
  function sevDTA_BLZFileDate(sDatum: PAnsiChar): LongInt; stdcall; external 'sevDTA32.DLL';

  {DTA-Datei erstellen, Datensätze schreiben, schliessen}
  function sevDTA_CreateFile(sFilename: PAnsiChar; iOvrWriteExists: LongInt): LongInt; stdcall; external 'sevDTA32.DLL';
  procedure sevDTA_CloseFile(fHandle: LongInt); stdcall; external 'sevDTA32.DLL';
  function sevDTA_FileInit(fHandle: LongInt; sKz, sBlz, sKtoNr, sName: PAnsiChar; iEuro: LongInt): LongInt; stdcall; external 'sevDTA32.DLL';
  function sevDTA_FileAddRec(fHandle: LongInt; sBlz1, sKtoNr1, sName1, sIntKdNr, sBlz2, sKtoNr2, sName2, sVerwendungAs, sBetrag: PAnsiChar): LongInt; stdcall; external 'sevDTA32.DLL';
  function sevDTA_FileEnd(fHandle: LongInt): LongInt; stdcall; external 'sevDTA32.DLL';
  function sevDTA_Kontrollsummen(SumDaten, SumBLZ, SumKtoNr, SumBetrag: PAnsiChar): LongInt; stdcall; external 'sevDTA32.DLL';
  procedure sevDTA_Print(hDC: LongInt; prnName, FontName, sName, sBLZ, sKtoNr, sDatum: PAnsiChar); stdcall; external 'sevDTA32.DLL';

  {BLZ Prüfroutinen}
  procedure sevDTA_BLZSetPath(sPath: PAnsiChar); stdcall; external 'sevDTA32.DLL';
  function sevDTA_BLZExists(sBlz: PAnsiChar): LongInt; stdcall; external 'sevDTA32.DLL';
  function sevDTA_BLZGetInfo(sBlz, sName, sPz: PAnsiChar): LongInt; stdcall; external 'sevDTA32.DLL';
  function sevDTA_CheckKontoNr(sBlz, sKontoNr, sPz: PAnsiChar): LongInt; stdcall; external 'sevDTA32.DLL';
  function sevDTA_BLZGetInfoEx(sBlz, sName, sPlz, sOrt, sBIC : PAnsiChar): LongInt; stdcall; external 'sevDTA32.DLL';

  {Kreditkarten Prüfroutine}
  function sevDTA_CheckCreditCard(sCardType, sCardNr, sMsgText: PAnsiChar; lLenRet: LongInt): LongInt; stdcall; external 'sevDTA32.DLL';

  {Übergeordnete routine}
  function CheckKontoNr(sKto, sBLZnr :String): Integer;
  function GetBLZInfo(sBLZnr : String): String;
  function GetDTAErr(lResult : Integer):String;

const
  {Fehler-Konstanten}
  ERR_DTA_SUCCESS = 0;

  {Initilisierung}
  ERR_DTA_INIT_FAILURE = -1;
  ERR_DTA_INIT_OK = 0;

  {FileHandle}
  ERR_DTA_NO_FILEHANDLE = 1;
  ERR_DTA_BAD_FILEHANDLE = 2;

  {DTA}
  ERR_DTA_BAD_KZ = 100;
  ERR_DTA_BAD_BLZ = 101;
  ERR_DTA_BAD_BLZ_LEN = 102;
...


function CheckKontoNr(sKto, sBLZnr :String): Integer;
var
   sKtoNr, sBlz, sPz, sName: String;
begin
     {Kontonummer prüfen}
     sKtoNr := sKto;
     sBlz := sBLZNr;
     { Wichtig! Mit ausreichend Leerstellen füllen! }
     SetLength(sName, 28);
     SetLength(sPz, 3);

     if sevDTA_BLZExists(PAnsiChar(sBlz)) = ERR_BLZ_OK then
     begin
        if sevDTA_BLZGetInfo(PAnsiChar(sBlz), PAnsiChar(sName), PAnsiChar(sPz)) = ERR_BLZ_OK then
           Result := sevDTA_CheckKontoNr(PAnsiChar(sBlz), PAnsiChar(sKtoNr), PAnsiChar(sPz))
        else
           Result := ERR_BLZ_KTONR_NOCHECK;
     end
     else
        Result := ERR_BLZ_KTONR_NOCHECK;
end;
In dem Beispiel läuft er immer nur noch auf 'ERR_BLZ_KTONR_NOCHECK'.

Auch bei der Initialisierung der DLL mittels einer Seriennummer bekomme ich keine Fehler.
Kann es nicht an den PAnsiChar Variablen liegen?
hatte schon mal alles als PWideChar übergeben bringt aber nichts... :-(

Für jegliche Hilfe bzw. Anregungen wäre ich dankbar!

Gruss
Stevie

DeddyH 4. Apr 2011 15:50

AW: externes DLL bei Delphi XE
 
Und wenn Du jetzt noch die Strings in AnsiStrings änderst, geht es dann?

Bernhard Geyer 4. Apr 2011 15:52

AW: externes DLL bei Delphi XE
 
Schau dir doch mal die Compilerwarnungen an. Diese sollten dich darauf hinweisen was falsch ist.

Supergrobie 4. Apr 2011 15:54

AW: externes DLL bei Delphi XE
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1092942)
Schau dir doch mal die Compilerwarnungen an. Diese sollten dich darauf hinweisen was falsch ist.

Zitat:

Zitat von DeddyH (Beitrag 1092941)
Und wenn Du jetzt noch die Strings in AnsiStrings änderst, geht es dann?

Hm, Du meinst die String mit denen ich die Routine aufrufe?
die werden doch bei der Übergabe and das DDL in PAnsiChar gewandelt. macht das "vorher" einen Unterschied?

0 Warnungen
0 Fehler...

DeddyH 4. Apr 2011 16:29

AW: externes DLL bei Delphi XE
 
Was ich meinte:
Delphi-Quellcode:
function CheckKontoNr(sKto, sBLZnr :AnsiString): Integer;
var
   sKtoNr, sBlz, sPz, sName: AnsiString;
Ich habe mein XE noch nicht lange genug, um genau sagen zu können, was bei einem Cast von Unicodestring -> PAnsiChar genau passiert, daher würde ich es einmal auf diesem Wege probieren.

Supergrobie 4. Apr 2011 16:56

AW: externes DLL bei Delphi XE
 
Zitat:

Zitat von DeddyH (Beitrag 1092961)
Was ich meinte:
Delphi-Quellcode:
function CheckKontoNr(sKto, sBLZnr :AnsiString): Integer;
var
   sKtoNr, sBlz, sPz, sName: AnsiString;
Ich habe mein XE noch nicht lange genug, um genau sagen zu können, was bei einem Cast von Unicodestring -> PAnsiChar genau passiert, daher würde ich es einmal auf diesem Wege probieren.

Ich hätte ja fast gewettet das es so nichts bringt... aber es geht! Danke!!!! :-D


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