Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi DDBAC Fehler: "Interface nicht unterstützt" (https://www.delphipraxis.net/195418-ddbac-fehler-interface-nicht-unterstuetzt.html)

Hobbycoder 27. Feb 2018 09:07

DDBAC Fehler: "Interface nicht unterstützt"
 
Hi,

ich schreibe grad an einer Anwendung in der ich Kontodaten abrufen will. Dafür nutze ich DDBAC. Aber an einer Stelle komme ich nicht weiter.
Hier der Source:
Delphi-Quellcode:
procedure TBankList.GetAmounts(ID, pin: string; bank: TBank);
var
  aHKKAZ: BACSegment;
  aMsgLogin, aMsgLogout: BACMessage;
  aMsg: BACMessage;
  fHaveSomething: Boolean;
  sCursor: String;
  aDataObject: BACDataObject;
  aTxn: BACTransaction;
  aHIKAZ, aHIKAZ2: BACSegment;
  aBlob: BACDataObject;
  aMT940: BACSwiftStatement;
  aLine: BACSwiftStatementLine;
  aBDP: BACSegments;
  a: TAmount;
  i, l, iSpeicherzeitraum: Integer;
  von, bis: TDateTime;
begin
  aDialog:=bank.contact.aContact.NewDialog(pin);
  if aDialog<>nil then
  begin
    aMsgLogin:=BACMessage(aDialog.BeginDialog(bacDialogStandard, ID, nil));
    if aDialog.HBCIResultCode>=9000 then Exit;
  end else Exit;
  fHaveSomething:=False;
  aBDP:=bank.contact.aContact.BankData.Segments;
  l:=aBDP.FindSegmentType('HIKAZS', 0);
  if l>=0then
  begin
    aHIKAZ:=BACSegment(aBDP.Item[l]);
    iSpeicherzeitraum:=aHIKAZ.Item['Parameter1', 'Speicherzeitraum1'];
    bis:=Now;
    von:=bis-iSpeicherzeitraum;
  end else begin
    bis:=Now;
    von:=bis-7;
  end;
  aDataObject:=CoBACDataObject.Create;
  aHKKAZ:=CreateTransactionSegment('HKKAZ', bank);
  SetAuftraggeberKontoverbindung(aHKKAZ, bank);
  aHKKAZ.Item['Kontowaehrung1',1]:=bank.account.aAccount.Currency;
  aHKKAZ.Item['AlleKonten1', 1]:=False;
  aHKKAZ.Item['DatumVon1', 1]:=von;
  aHKKAZ.Item['DatumBis1', 1]:=bis;
  repeat
    aMsg:=BACMessage(aDialog.ExecuteSegment(aHKKAZ));
    ReportResult(aMsg, sCursor, aHKKAZ);
    aTxn:=aMsg.Transactions[0];
    if aTxn.ResponseSegments.Count=1 then
    begin
      aHIKAZ2:=BACSegment(aTxn.ResponseSegments[0]);
      DoDisplayTransactionStatusText(aHIKAZ2.GetXML);
      if not VarIsEmpty(aHIKAZ2.Item['UmsaetzeGebucht1', 1]) then
      begin
        fHaveSomething:=True;
        aBlob:=IUnknown(aHIKAZ2.item['UmsaetzeGebucht1', 1]) as IBACDataObject2; // <<<<<<<< - Hier tritt der Fehler auf
        aDataObject.PutString(aDataObject.GetString+aBlob);
      end;
    end;
    if Length(sCursor)=0 then
      Break else
      aHKKAZ.Item['Aufsetzpunkt1', 1] := sCursor;
  until true;
  if fHaveSomething then
  begin
    aMT940:=CoBACSwiftStatement.Create;
    aDataObject.WriteToObject(aMT940);
    //a:=TAmount.Create;
    for i:=0 to aMT940.StatementLines.Count-1 do
    begin
      aLine:=BACSwiftStatementLine(aMT940.StatementLines[i]);
      //a.AccountNumber:=aLine.AccountNumber;
      //Daten lesen
    end;
    //bank.amountList.Add(a);
  end;
  aMsgLogout:=BACMessage(aDialog.EndDialog(nil));
end;
in der markierten Zeile
Delphi-Quellcode:
 aBlob:=IUnknown(aHIKAZ2.item['UmsaetzeGebucht1', 1]) as IBACDataObject2;
tritt folgender Fehler auf: "Im Projekt ist eine Exception der Klasse EIntfCastError mit der Meldung 'Interface nicht unterstützt' aufgetreten".

Da ich mich mit Interfaces so gar nicht auskenne bleibt mir der Ursprung dieses Fehlers verborgen und ich hoffe auf eure Hilfe.
Bis zu dieser Zeile funktioniert alles. Auch werden Umsatzdaten geholt.

Kennt jemand dieses Problem und kann mir bei der Lösung helfen? Danke.

Fritzew 27. Feb 2018 12:43

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Welche Version von DDBAC setzt Du ein?
Wo ist sie her? Da sind einige unterschiedliche im Umlauf.

Hobbycoder 1. Mär 2018 10:30

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für deine Antwort: Ich verwende Version: 5.3.23.0.

Hab gestern mal getestet ob das mitgelieferte Beispiel FinTSPadDelphi ausprobiert. Läuft Fehlerfrei. Dem zur Folge kann es an DDBAC und dessen Installation eigentlich nicht liegen.
Also habe ich meine komplette Implementierung erst mal wieder gelöscht und stumpf per CopyAndPaste alle relevanten Methoden aus der FinTSPadDelphi übernommen und nur geringfügig an die Gegebenheiten angepasst. Lieder tritt wieder der gleiche Fehler auf. Aber Grundsätzlich muss es ja doch an mir liegen.

Ich habe mal meine Unit angehängt. Vielleicht hat ja jemand Lust und Muße mal drüber zu schauen. Der Fehler tritt in der Procedure GetAmount in Zeile 739 auf.

Wie gesagt, Anmeldung bei der Bank und das Holen der Buchungen funktioniert auch. Lediglich bei dem Cast als IUnKnown kommt der Fehler.

Vielen Dank

Hobbycoder 2. Mär 2018 09:52

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Keiner eine Idee?

freimatz 2. Mär 2018 11:58

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
ich habe keine Ahnung von den verwendeten Dingen aber ich würde wie immer erst mal die Zeile zerlegen. In dem Fall in drei. Erstmal "aHIKAZ2.item['UmsaetzeGebucht1', 1]" einer lokalen Variablen zuweisen und schauen (direkt oder im debugger) was das überhaupt ist.
Vermutlich ist das gar kein IUnknown.

Hobbycoder 2. Mär 2018 12:37

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Da geht's ja schon los ;-)
Leider steh ich bei Interfaces auch komplette daneben.

Wenn ich aHIKAZ.Item['UmsaetzeGebucht1', 1] auslesen will, dann bekomme ich die Fehlermeldung das wäre vom Typ Dispatch.
Ich kann wohl aHIKAZ.GetXML ausführe und bekomme dann die Umsaetze als XML in einen WideString. Da steht auch alles drin wie erwartet, aber ich muss das ja irgendwie in den aBlob vom Typ BACDataObject kriegen.

Möglicherweise könnte ich das XML selbst auswerten, aber da das ja geht wenn ich die FinTSPadDelphi, die mitgeliefert wurde, ausführe sollte es ja gehen. Und ich würde das auch gerne so machen.
Wenn ich versuche direkt auf IBACDataObject2 zu casten geht das ebenfalls nicht. Es wird schon gar nicht compiliert wegen ungültiger Typenumwandlung.

Ich habe ja alles per CopyAndPaste übernommen, und es sollte dann auch so funktionieren. Der einzige Unterschied den ich erkennen kann, ist die Tatsache das es in der FinTSPadDelphi in einer Class(TForm) eingebettet ist, und bei mir in einer Class(TObject). Aber das sollte keinen Unterschied ausmachen.

Hobbycoder 5. Mär 2018 13:34

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich muss dieses Thema noch mal aufgreifen, weil ich leider noch kein Stück weiter gekommen bin.

Mittlerweile habe ich meinen kompletten Code wieder verworfen, und mir ein kleines Testprogramm geschrieben, mit welchem ich das noch mal überprüft habe. Im Testprojekt funktioniert es wieder.
Dann habe ich alles in dem eigentlichen Zielprojekt nochmal gemacht, funktioniert wieder nicht! Gleicher Fehler.
Der Unterschied zwischen meinem Testprojekt (und auch dem mitgelieferten Beispiel) und dem eigentlichen Zielprojekt ist, dass im Testprojekt und im mitgelieferten Beispiel alle Variablen und Funktionen innerhalb der Form deklariert sind, bzw. in dieser Instanz ablaufen. In meinem Zielprojekt möchte ich das ganze aber in eine Klasse packen, wo es dann wieder nicht funktioniert. Fehler: 'Interface nicht unterstützt' in der gleichen Zeile wie im ersten Post.

Kenn es sein, dass ein Interface irgendwie von einer Form abhängig sein kann? Kann ich mir zwar nicht vorstellen, aber es muss ja irgendwas damit zu tun haben.

Ich hänge mal mein Testprojekt und die Klassenunit an.

Idiomatix 5. Mär 2018 14:53

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Hallo,
könntest Du bitte noch die fehlende Unit "AMAmountObject.pas" in Dein Testprojekt hochladen. Die DDDBAC-Type Libraries habe ich mir selbst erstellt.
MfG

Hobbycoder 6. Mär 2018 08:44

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Natürlich ;-) Hatte vergessen, dass man die benötigt.

Idiomatix 6. Mär 2018 09:47

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Hallo Hobbycoder,
habs mit Deinen Units ausprobiert. Klappt einwandfrei. Getestet mit verschiedenen, privaten Bankkonten.
Jedoch basierten meine Typelibs auf der DDBAC-Version 5.6.71, die vor 4 Wochen noch aktuell war. Mittlerweile sind wir bei 5.6.73.
Meine Vermutung ist, dass Deine Typlibs zu alt sind. Vorschlag: Hol Dir das aktuelle DDBAC-SDK,
installiere es, erstelle die beiden Typelibs neu (also auf keinen Fall die aus dem mitgelieferten Demo-Projekt nehmen) und
binde sie in Dein Projekt ein. Achte auf Win32bit als Zielplattform beim Kompilieren.
Erstelle dann im Homebanking Banking Admin (Systemsteuerung) mindestens einen Bankkontakt und synchronisiere diesen. Nimm ein Bankkonto,
auf dem in den letzten acht Tagen Bewegungen waren. Dann sollten auch bei Dir die Umsatzbeträge im Memo-Feld angezeigt werden.:-D

Bei Fragen zu Interfaces hilft vielleicht diese englische Einführung http://techvanguards.com/ weiter. Zugegeben, ist schon etwas älter, aber sehr gut
erklärt.
MfG

Hobbycoder 6. Mär 2018 09:53

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Danke für deine Hilfe. Ich werde das ausprobieren.

Hobbycoder 6. Mär 2018 10:13

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Leider habe ich den gleichen Fehler.
Erst habe ich Delphi beenden.
Dann habe ich die importierten Typenbibliotheken aus Imports gelöscht.
Danach DDBACSDK gelöscht.
Die aktuellste Version heruntergeladen und Installiert.
HBCI-Administration aufgerufen und neu Synchronisiert (Ohne Fehler).
Dann Delphi wieder gestartet und Projekt aufrufen. Kompilierungsversuch (zur Kontrolle) -> Fehler, denn die Typenbibliotheken fehlen noch
Typenbibliotheken import.
Projekt Kompiliert -> Fehlerfrei.

Zur Laufzeit dann wieder der gleiche Fehler.

Es wundert mich ja sowieso, denn in dem Testprojekt (welches ich im vorletzten Post angehängt hatte) tritt der Fehler nicht auf. Dem zur Folge gehe ich mal von einer korrekten Installation von DDBAC aus.
Mein Klasse scheint aber soweit zu funktionieren, denn sie läuft ja bei dir.
Ich bin jetzt bei der Fehlersuche etwas Ratlos, wie ich da weiter vorgehen könnte.

Ich werde mir jetzt erst mal ein weiteres Testprogramm schreiben, in dem ich die Klasse DDBACHelperObject verwenden. Ich befürchte allerdings, dass die dort läuft :roll:

Idiomatix 6. Mär 2018 11:29

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
ich würde an Deiner Stelle nochmals das komplette SDK deinstallieren und dabei auch den
DDBACCleaner.exe bemühen, der dabei war.
Anschließend zur Sicherheit und wegen der Paranoia :-D alle Dateien in folgenden
(Standard-Installations)Pfaden löschen (soweit noch vorhanden):

C:\Program Files (x86)\Common Files\DataDesign\DDBAC\*.*
C:\Program Files (x86)\DataDesign\DDBACSDK\*.*

Dann mit äußerster Vorsicht die folgenden beiden DDBAC*.CPL-Dateien Pfad löschen:
C:\Windows\SysWOW64\DDBACCPL.CPL (das ist der HomeBanking Admin in der Systemsteuerung)
C:\Windows\SysWOW64\ddBACCTM.cpl

Desweiteren noch alle Dateien aus dem Verzeichnis:
C:\Users\<DeinUserName>\AppData\Roaming\DataDesign \DDBAC löschen
Dort sind die jeweiligen Bank-und Userparameterdateien *.upd,*.bpd,*.spa
sowie die ddusers.dat beheimatet, die Du zuvor über den HomeBanking Admin
angelegt hattest.

Und wegen des Peace of Mind noch alle "DDBACSWIFT_TLB.*" und alle "BankingApplicationComponents_TLB.*"
löschen, die Du auf Deinem Rechner finden konntest.

Dann würde ich in der Registry alle Schlüssel und CLSIDs mit "DataDesign" und
"DDBAC" löschen, falls denn noch welche übriggeblieben sein sollten.
(Auf eigenes Risiko wohlgemerkt!)


Abschließend die Maschine neu durchstarten, das neueste DDBAC-SDK installieren
und HomeBanking Kontakt mit aktivem Bankkonto wieder einrichten.

Dann würde ich die beiden Typelibs neu erstellen
"BankingApplicationComponents_TLB.pas" aus ddBAC.dll
sowie
"DDBACSWIFT_TLB.pas" aus DDBACMT9.dll
Die genannten DLLs sind im Verzeichnis C:\Program Files (x86)\Common Files\DataDesign\DDBAC
zu finden. Im Kopf der erzeugten PAS-Dateien steht dann normalerweise
das aktuelle Systemdatum sowie die Herkunft.

Die beiden Typelibs (pas-Dateien) platzierst Du dann direkt in Dein Unit-Verzeichnis
wie auf beigefügtem Screenshot ersichtlich. Also nicht mit Imports arbeiten.
Viel Erfolg :-D

Hobbycoder 6. Mär 2018 13:17

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab jetzt noch mal alles so gemacht, wie du es vorgeschlagen hat. Leider mit dem altbekannten Ergebnis.
Ich bin mir gar nicht mehr so sicher, dass das was mit DDBAC selbst zu tun hat.
Leider kann ich diese Zeile
Delphi-Quellcode:
aBlob := IUnknown(aHIKAZ.Item['UmsaetzeGebucht1', 1]) as IBACDataObject2;
nicht weiter zerlegen bzw. debuggen, weil mir einfach das Wissen bezüglich Interfaces fehlt. Ich weiß zwar grundlegend was da passiert, aber für debuggen reicht das leider nicht aus.

Ich habe jetzt die DDBACHelperObject.pas ein dem Projekt BankTest3 verwendet. leider ohne Erfolg.

Noch eine Idee?
Langsam verzweifele ich. Wenn ich das direkt in einer Form verpacke läuft's. Wenn du meine Klasse nutzt läuft's auch. Wenn ich meine Klasse nutze läuft's nicht?

BankTest3 hänge ich mal an (Drin enthalten sind auch die beiden BankingApplicationComponents_TLB.pas und DDBACSWIFT_TLB.pas).

Idiomatix 7. Mär 2018 11:43

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Hallo,

hmmm.
Versuchsweise hatte ich mal unmittelbar vor Deinem o.g. "soft" Typecast die folgende Zeilen in die Projekte BankTest2 und BankTest3 eingefügt.
Delphi-Quellcode:
  anIID := StringToGUID('{DD000122-3E33-11D1-A006-0060088FF6B8}'); // TGUID von IBacDataObject2
  if IUnknown(aHIKAZ.Item['UmsaetzeGebucht1', 1]).QueryInterface(anIID,p) <> 0 Then
    Begin
      ShowMessage('Fehler');  // VCL.Dialogs in uses clause ! 
      Exit;
    End
  else
    Begin
      if Assigned(p) then
        ShowMessage('Alles klar');
    End;
und zuvor anIID als TGUID- und p als Pointer-Variable deklariert. Dann habe ich noch sichergestellt,
dass das Interface IBacDataObject2 korrekt in der Registry steht.

Ergebnis: BankTest2 : Alles klar, BankTest3: Fehler.

Damit ist klar, dass aHIKAZ bei BankTest3 noch nicht richtig initialisiert zu sein scheint. Dachte zunächst an ein
fehlendes CoInitializeEx, aber wir haben es doch hier mit keiner MultiThreaded-Applikation zu tun.
Vielleicht liegt es auch an den beiden fehlenden Container-Objekten in BankTest3.
Da würde ich mal weiterschauen.
MfG

Idiomatix 7. Mär 2018 13:55

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Yep,
genau das wars. Anbei die funktionierende DDBACHelper-Unit.
MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 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 by Thomas Breitkreuz