Hi NG,
das Subject klingt vielliecht etwas blöde, aber es sollte versucht werden,
das gesamte Problem in ein subject zu packen ...
Falls hier das flasche Forum sein sollte ... nicht schimpfen, ich finde keinen besseren Ort.
Vor Jahren habe ich ein Programm geschrieben, damals unter VB6, welches
unter Nutzung der DDBAC-Komponenten der Fa. Datadesign (www.datadesign.de)
Kontobuchungen per HBCI bei der Bank abholt und verarbeitet.
Hat immer klaglos funktioniert, aber mittlerweile sollte die Funktion
erweitert werden.
Die Quelltexte sind leider verloren gegangen - es steht also ein kompletter
"rewrite from scratch" an, zeitgemäss unter VB.NEt 2008
Zu den DDBAC-Komponenten ist auf der Webseite sogar ein SDK downloadbar,
samt einer Beispielanwendung namens HBCIPAD nebst Quelltexten.
Auch diese Anwendung scheint unter VB6 geschrieben zu sein. Warum auch
immer - das Projekt liess sich nicht fehlerfrei konvertieren.
Dennoch habe ich kurzerhand Codeteile recycelt und modifiziert übernommern.
Speziell der folgende Part macht Probleme:
Hier der Original-VB6-Code:
Dim aHKKAZ As BACSegment
Dim aMsg As BACMessage
Dim fHaveSomething As Boolean
...
Set aHKKAZ = CreateTransactionSegment("HKKAZ")
SetAuftraggeberKontoverbindung aHKKAZ
...
aHKKAZ("AlleKonten1") = False
...
' Bei der Verarbeitung des HKKAZ Segments kann der HBCI Server einen
' Aufsetzpunkt zurückmelden. Aus diesem Grund kann es erforderlich sein,
' dass das Auftragssegment wiederholt übermittelt werden muss.
Dim sCursor As String
Dim aDataObject As New BACDataObject
Do
' Das Auftragssegment wird übermittelt und die Rückmeldungen werden
' überprüft. Eventuelle Warnungen oder Fehler werden angezeigt.
SupplyTAN
Set aMsg = maDialog.ExecuteSegment(aHKKAZ)
ReportResult aMsg, sCursor, aHKKAZ
' Die Antwortdaten werden zur Ausgabe hinzugefügt.
Dim aTxn As BACTransaction
Dim aHIKAZ As BACSegment
Dim aBlob As New BACDataObject
Set aTxn = aMsg.Transactions(0)
If aTxn.ResponseSegments.Count = 1 Then
Set aHIKAZ = aTxn.ResponseSegments(0)
If Not IsEmpty(aHIKAZ("UmsaetzeGebucht1")) Then
fHaveSomething = True
Set aBlob = aHIKAZ("UmsaetzeGebucht1")
' Die empfangenen Daten werden jetzt an das als Sammelbecken
' agierende Datenobjekt angehängt.
aDataObject.PutString aDataObject.GetString &
aBlob.GetString
End If
End If
' Falls kein Aufsetzpunkt gemeldet wurde, sind wir jetzt fertig.
' Ansonsten wird die Auftragsnachricht mit einem Aufsetzpunkt
' wiederholt.
If Len(sCursor) = 0 Then
Exit Do
Else
aHKKAZ("Aufsetzpunkt1") = sCursor
End If
Loop
.
Der Knackpunkt scheinen die Objekte aBlob und aHIKAZ zu sein.
Die Anfoderung frü den Kontauszug wird korrekt übermittelt und von der Bank
angenommen.
'Set aMsg = maDialog.ExecuteSegment(aHKKAZ)
ReportResult aMsg, sCursor, aHKKAZ'
Später wird aBlob etwas zugewiesen: Set aBlob =
aHIKAZ("UmsaetzeGebucht1")
Und genau hier crasht der Code beim Ausführen.
Fehlermeldung:
Das COM-Objekt des Typs "System.__ComObject" kann nicht in den
Schnittstellentyp "BankingApplicationComponents.BACDataObject" umgewandelt
werden. Dieser Vorgang konnte nicht durchgeführt werden, da der
QueryInterface-Aufruf an die COM-Komponente für die Schnittstelle mit der
IID "{DD000122-3E33-11D1-A006-0060088FF6B8}" aufgrund des folgenden Fehlers
nicht durchgeführt werden konnte: Schnittstelle nicht unterstützt (Ausnahme
von HRESULT: 0x80004002 (E_NOINTERFACE)).
Zusätzlich wird noch angegeben:
System.InvalidCastException wurde nicht behandelt.
Message="Das COM-Objekt des Typs "System.__ComObject" kann nicht in den
Schnittstellentyp "BankingApplicationComponents.BACDataObject" umgewandelt
werden. Dieser Vorgang konnte nicht durchgeführt werden, da der
QueryInterface-Aufruf an die COM-Komponente für die Schnittstelle mit der
IID "{DD000122-3E33-11D1-A006-0060088FF6B8}" aufgrund des folgenden Fehlers
nicht durchgeführt werden konnte: Schnittstelle nicht unterstützt (Ausnahme
von HRESULT: 0x80004002 (E_NOINTERFACE))."
Source="HBCI_Kontenscanner2"
StackTrace:
bei HBCI_Kontenscanner2.Module1.GetKontoauszugHBCI(BACDialog dialog,
BACAccount konto, BACCustomer& cust) in C:\Dokumente und
Einstellungen\nico.THOMAE6.000\Eigene Dateien\Visual Studio
2008\Projects\HBCI_Kontenscanner2\HBCI_Kontenscanner2\Module1.vb:Zeile 1003.
bei HBCI_Kontenscanner2.Module1.ProcessCustomer(BACCustomer& cust,
BACDialog& dialog, BACContact& maContact, Int32 sess, Int32 contact, Int32
run_key) in C:\Dokumente und Einstellungen\nico.THOMAE6.000\Eigene
Dateien\Visual Studio
2008\Projects\HBCI_Kontenscanner2\HBCI_Kontenscanner2\Module1.vb:Zeile 383.
bei HBCI_Kontenscanner2.Module1.Main() in C:\Dokumente und
Einstellungen\nico.THOMAE6.000\Eigene Dateien\Visual Studio
2008\Projects\HBCI_Kontenscanner2\HBCI_Kontenscanner2\Module1.vb:Zeile 242.
bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence
assemblySecurity, String[] args) bei
Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() bei
System.Threading.ThreadHelper.ThreadStart_Context(Object state) bei
System.Threading.ExecutionContext.Run(ExecutionContext executionContext,
ContextCallback callback, Object state) bei
System.Threading.ThreadHelper.ThreadStart()
InnerException:
Was kann ich dagegen tun ?
Diese Zeile müsste doch eigentlich korrekt sein, da aus einer
funktionerenden VB6-Anwendung stammend ?
Gruss Nico
das Subject klingt vielliecht etwas blöde, aber es sollte versucht werden,
das gesamte Problem in ein subject zu packen ...
Falls hier das flasche Forum sein sollte ... nicht schimpfen, ich finde keinen besseren Ort.
Vor Jahren habe ich ein Programm geschrieben, damals unter VB6, welches
unter Nutzung der DDBAC-Komponenten der Fa. Datadesign (www.datadesign.de)
Kontobuchungen per HBCI bei der Bank abholt und verarbeitet.
Hat immer klaglos funktioniert, aber mittlerweile sollte die Funktion
erweitert werden.
Die Quelltexte sind leider verloren gegangen - es steht also ein kompletter
"rewrite from scratch" an, zeitgemäss unter VB.NEt 2008
Zu den DDBAC-Komponenten ist auf der Webseite sogar ein SDK downloadbar,
samt einer Beispielanwendung namens HBCIPAD nebst Quelltexten.
Auch diese Anwendung scheint unter VB6 geschrieben zu sein. Warum auch
immer - das Projekt liess sich nicht fehlerfrei konvertieren.
Dennoch habe ich kurzerhand Codeteile recycelt und modifiziert übernommern.
Speziell der folgende Part macht Probleme:
Hier der Original-VB6-Code:
Dim aHKKAZ As BACSegment
Dim aMsg As BACMessage
Dim fHaveSomething As Boolean
...
Set aHKKAZ = CreateTransactionSegment("HKKAZ")
SetAuftraggeberKontoverbindung aHKKAZ
...
aHKKAZ("AlleKonten1") = False
...
' Bei der Verarbeitung des HKKAZ Segments kann der HBCI Server einen
' Aufsetzpunkt zurückmelden. Aus diesem Grund kann es erforderlich sein,
' dass das Auftragssegment wiederholt übermittelt werden muss.
Dim sCursor As String
Dim aDataObject As New BACDataObject
Do
' Das Auftragssegment wird übermittelt und die Rückmeldungen werden
' überprüft. Eventuelle Warnungen oder Fehler werden angezeigt.
SupplyTAN
Set aMsg = maDialog.ExecuteSegment(aHKKAZ)
ReportResult aMsg, sCursor, aHKKAZ
' Die Antwortdaten werden zur Ausgabe hinzugefügt.
Dim aTxn As BACTransaction
Dim aHIKAZ As BACSegment
Dim aBlob As New BACDataObject
Set aTxn = aMsg.Transactions(0)
If aTxn.ResponseSegments.Count = 1 Then
Set aHIKAZ = aTxn.ResponseSegments(0)
If Not IsEmpty(aHIKAZ("UmsaetzeGebucht1")) Then
fHaveSomething = True
Set aBlob = aHIKAZ("UmsaetzeGebucht1")
' Die empfangenen Daten werden jetzt an das als Sammelbecken
' agierende Datenobjekt angehängt.
aDataObject.PutString aDataObject.GetString &
aBlob.GetString
End If
End If
' Falls kein Aufsetzpunkt gemeldet wurde, sind wir jetzt fertig.
' Ansonsten wird die Auftragsnachricht mit einem Aufsetzpunkt
' wiederholt.
If Len(sCursor) = 0 Then
Exit Do
Else
aHKKAZ("Aufsetzpunkt1") = sCursor
End If
Loop
.
Der Knackpunkt scheinen die Objekte aBlob und aHIKAZ zu sein.
Die Anfoderung frü den Kontauszug wird korrekt übermittelt und von der Bank
angenommen.
'Set aMsg = maDialog.ExecuteSegment(aHKKAZ)
ReportResult aMsg, sCursor, aHKKAZ'
Später wird aBlob etwas zugewiesen: Set aBlob =
aHIKAZ("UmsaetzeGebucht1")
Und genau hier crasht der Code beim Ausführen.
Fehlermeldung:
Das COM-Objekt des Typs "System.__ComObject" kann nicht in den
Schnittstellentyp "BankingApplicationComponents.BACDataObject" umgewandelt
werden. Dieser Vorgang konnte nicht durchgeführt werden, da der
QueryInterface-Aufruf an die COM-Komponente für die Schnittstelle mit der
IID "{DD000122-3E33-11D1-A006-0060088FF6B8}" aufgrund des folgenden Fehlers
nicht durchgeführt werden konnte: Schnittstelle nicht unterstützt (Ausnahme
von HRESULT: 0x80004002 (E_NOINTERFACE)).
Zusätzlich wird noch angegeben:
System.InvalidCastException wurde nicht behandelt.
Message="Das COM-Objekt des Typs "System.__ComObject" kann nicht in den
Schnittstellentyp "BankingApplicationComponents.BACDataObject" umgewandelt
werden. Dieser Vorgang konnte nicht durchgeführt werden, da der
QueryInterface-Aufruf an die COM-Komponente für die Schnittstelle mit der
IID "{DD000122-3E33-11D1-A006-0060088FF6B8}" aufgrund des folgenden Fehlers
nicht durchgeführt werden konnte: Schnittstelle nicht unterstützt (Ausnahme
von HRESULT: 0x80004002 (E_NOINTERFACE))."
Source="HBCI_Kontenscanner2"
StackTrace:
bei HBCI_Kontenscanner2.Module1.GetKontoauszugHBCI(BACDialog dialog,
BACAccount konto, BACCustomer& cust) in C:\Dokumente und
Einstellungen\nico.THOMAE6.000\Eigene Dateien\Visual Studio
2008\Projects\HBCI_Kontenscanner2\HBCI_Kontenscanner2\Module1.vb:Zeile 1003.
bei HBCI_Kontenscanner2.Module1.ProcessCustomer(BACCustomer& cust,
BACDialog& dialog, BACContact& maContact, Int32 sess, Int32 contact, Int32
run_key) in C:\Dokumente und Einstellungen\nico.THOMAE6.000\Eigene
Dateien\Visual Studio
2008\Projects\HBCI_Kontenscanner2\HBCI_Kontenscanner2\Module1.vb:Zeile 383.
bei HBCI_Kontenscanner2.Module1.Main() in C:\Dokumente und
Einstellungen\nico.THOMAE6.000\Eigene Dateien\Visual Studio
2008\Projects\HBCI_Kontenscanner2\HBCI_Kontenscanner2\Module1.vb:Zeile 242.
bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence
assemblySecurity, String[] args) bei
Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() bei
System.Threading.ThreadHelper.ThreadStart_Context(Object state) bei
System.Threading.ExecutionContext.Run(ExecutionContext executionContext,
ContextCallback callback, Object state) bei
System.Threading.ThreadHelper.ThreadStart()
InnerException:
Was kann ich dagegen tun ?
Diese Zeile müsste doch eigentlich korrekt sein, da aus einer
funktionerenden VB6-Anwendung stammend ?
Gruss Nico