Fehler beim Zugriff auf Webservice

26/08/2007 - 12:28 von Alois Ulz | Report spam
Hallo NG,

ich versuche eine umfangreiche VB6.0-Anwendung um den Zugriff auf Webservices zu erweitern. Mit dem MS Soap Toolkit 3.0 sollte das ja auch kein Problem sein. Mit einfachen Übergabe-/Rückgabewerten funktioniert der Zugriff ja auch. Bei komplexen Typen erhalte ich jedoch einen VB-Fehler...

Beispiel-Webservice: http://www.webservicex.net/LondonGoldFix.asmx

Ich habe dazu eine ActiveX DLL mit einem Klassenmodul "ClsLondon" erstellt [1]. In der Anwendung [2] referenziere ich die ActiveX DLL und die MS Soap Type Library v3.0. Beim Zugriff auf den Webservice kommt es dann zu einem Fehler 13 (Typen unvertràglich).

Worin liegt mein Fehler?

Danke.

Alois Ulz

###########################
[1] Code in der ActiveX DLL
###########################

Option Explicit

Private mfGold_AM_USD As Single
Private mfGold_AM_STG As Single
Private mfGold_AM_EUR As Single
Private mfGold_PM_USD As Single
Private mfGold_PM_STG As Single
Private mfGold_PM_EUR As Single
Private mfSilver_CENTS As Single
Private mfSilver_PENCE As Single
Private mfSilver_EUR As Single
Private msStatus As String

Public Property Get Gold_AM_USD() As Single
Gold_AM_USD = mfGold_AM_USD
End Property
Public Property Let Gold_AM_USD(ByVal fValue As Single)
mfGold_AM_USD = fValue
End Property
Public Property Get Gold_AM_STG() As Single
Gold_AM_STG = mfGold_AM_STG
End Property
Public Property Let Gold_AM_STG(ByVal fValue As Single)
mfGold_AM_STG = fValue
End Property
Public Property Get Gold_AM_EUR() As Single
Gold_AM_EUR = mfGold_AM_EUR
End Property
Public Property Let Gold_AM_EUR(ByVal fValue As Single)
mfGold_AM_EUR = fValue
End Property
Public Property Get Gold_PM_USD() As Single
Gold_PM_USD = mfGold_PM_USD
End Property
Public Property Let Gold_PM_USD(ByVal fValue As Single)
mfGold_PM_USD = fValue
End Property
Public Property Get Gold_PM_STG() As Single
Gold_PM_STG = mfGold_PM_STG
End Property
Public Property Let Gold_PM_STG(ByVal fValue As Single)
mfGold_PM_STG = fValue
End Property
Public Property Get Gold_PM_EUR() As Single
Gold_PM_EUR = mfGold_PM_EUR
End Property
Public Property Let Gold_PM_EUR(ByVal fValue As Single)
mfGold_PM_EUR = fValue
End Property
Public Property Get Silver_CENTS() As Single
Silver_CENTS = mfSilver_CENTS
End Property
Public Property Let Silver_CENTS(ByVal fValue As Single)
mfSilver_CENTS = fValue
End Property
Public Property Get Silver_PENCE() As Single
Silver_PENCE = mfSilver_PENCE
End Property
Public Property Let Silver_PENCE(ByVal fValue As Single)
mfSilver_PENCE = fValue
End Property
Public Property Get Silver_EUR() As Single
Silver_EUR = mfSilver_EUR
End Property
Public Property Let Silver_EUR(ByVal fValue As Single)
mfSilver_EUR = fValue
End Property
Public Property Get Status() As String
Status = msStatus
End Property
Public Property Let Status(ByVal sValue As String)
msStatus = sValue
End Property

#########################
[2] Code in der Anwendung
#########################

Option Explicit

Private Sub Command1_Click()
Dim oSoap As MSSOAPLib30.SoapClient30
Dim oLondon As LondonType.ClsLondon

Set oSoap = New MSSOAPLib30.SoapClient30
Set oLondon = New LondonType.ClsLondon

On Error Resume Next
Call oSoap.MSSoapInit("http://www.webservicex.net/LondonGo...WSDL")
If Err.Number Then
MsgBox "Init Failure: " + Err.Description & vbNewLine & _
"Error: " + Err.Description & vbNewLine & _
"Error Code: " + oSoap.FaultCode & vbNewLine & _
"Error String: " + oSoap.FaultString & vbNewLine & _
"Fault Actor: " + oSoap.FaultActor & vbNewLine & _
"Detailed Information: " + oSoap.Detail
Err.Clear
End If
On Error GoTo 0

'In der nachfolgenden Zeile tritt der Fehler auf.
'Fehler 13 - Typen unvertràglich
Set oLondon = oSoap.GetLondonGoldAndSilverFix

'

Set oSoap = Nothing
Set oLondon = Nothing
End Sub
 

Lesen sie die antworten

#1 Schmidt
26/08/2007 - 17:36 | Warnen spam
"Alois Ulz" schrieb im Newsbeitrag
news:

Worin liegt mein Fehler?


Dein Fehler liegt darin, dass die SoapEngine Deine
ComplexType-Klasse gar nicht kennt - Du aber einen
expliziten Cast auf Deine Typ-Klasse forderst, welcher
so direkt gar nicht möglich ist.

ComplexTypes werden als IXMLDOMNodeList
zurückgegeben.
Du musst also noch einen Extra-Loop über das Result
drehen, um Deine Class-Members entsprechend zu
befüllen.

Hier mal Dein Beispiel zum Laufen gebracht (ohne Deine Typ-
Klasse, und erstmal LateBound, ohne IXMLDOMxxx-types):

Private Sub Command1_Click()
Dim oSoap As SoapClient

Set oSoap = New SoapClient

On Error Resume Next
Call
oSoap.mssoapinit("http://www.webservicex.net/LondonGo...WSDL")
If Err.Number Then
MsgBox "Init Failure: " + Err.Description & vbNewLine & _
"Error: " + Err.Description & vbNewLine & _
"Error Code: " + oSoap.faultcode & vbNewLine & _
"Error String: " + oSoap.faultstring & vbNewLine & _
"Fault Actor: " + oSoap.faultactor & vbNewLine & _
"Detailed Information: " + oSoap.detail
Err.Clear
Exit Sub
End If

Dim ComplexType As Object 'IXMLDOMNodeList
Dim Node As Object 'IXMLDOMNode
Set ComplexType = oSoap.GetLondonGoldAndSilverFix
If Err Then
MsgBox Err.Description
Exit Sub
End If

For Each Node In ComplexType
Debug.Print Node.tagName, Node.Text
Next Node
End Sub

Olaf

Ähnliche fragen