AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

externes DLL bei Delphi XE

Ein Thema von Supergrobie · begonnen am 4. Apr 2011 · letzter Beitrag vom 4. Apr 2011
Antwort Antwort
Supergrobie

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

externes DLL bei Delphi XE

  Alt 4. Apr 2011, 15:46
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
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: externes DLL bei Delphi XE

  Alt 4. Apr 2011, 15:50
Und wenn Du jetzt noch die Strings in AnsiStrings änderst, geht es dann?
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 Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: externes DLL bei Delphi XE

  Alt 4. Apr 2011, 15:52
Schau dir doch mal die Compilerwarnungen an. Diese sollten dich darauf hinweisen was falsch ist.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Supergrobie

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

AW: externes DLL bei Delphi XE

  Alt 4. Apr 2011, 15:54
Schau dir doch mal die Compilerwarnungen an. Diese sollten dich darauf hinweisen was falsch ist.
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...
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: externes DLL bei Delphi XE

  Alt 4. Apr 2011, 16:29
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.
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
 
#6

AW: externes DLL bei Delphi XE

  Alt 4. Apr 2011, 16:56
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!!!!
Stefan
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:16 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