Не нашел в винде штатной возможности делать из VB6 запросы XML-RPC. В инете нашел только коммерческие реализации (может плохо искал или хорошо зарыто). В результате написал свою реализацию. Во многом она еще сырая, но потестить уже можно.
Мне потребовались ассоциативные массивы и на свет появились классы CAssocArray и CAssocItem. В отличии от элементов Collection, CAssocItem хранит свой ключ (копию) и он доступен (для всего, но писать в него не рекомендую).
Тот же CAssocItem использовал вместо Variant в рекурсивном разборе ответа в качестве параметра. Может можно было иначе, но синтаксис VB меня просто убивает и проще перейти совсем на объекты. чем мешать все в кучу.
Код для класса CBase64 целиком взят из инета в готовом виде. Работает на ура, но есть огромный минус: для хранения бинарных данных используется Byte(), что ограничивает объем до 32767 байт. По этой причине (и не только) реализовал тип <base64> только в декодере ответа, а в запросе код закомментировал (он не работает).
Код CInetTime также взят из инета, но подрихтован и дополнен. Он очень сырой.
Сам клиент помещен в класс CXMLRPCRequest.
Интерфейс:
Public Function doCall(url As String, method As String, ByRef params As Variant, ByRef result As Variant) As Boolean
Public Sub encodeRequest(ByVal method As String, ByRef request As Variant, ByRef xml As String)
Public Sub decodeResponse(ByRef xml As MSXML2.DOMDocument, ByRef argv As Variant, ByRef fault As Boolean)
Для выполнения запросов достаточно doCall.
Тест:
Private Sub Command1_Click()
Dim rpc As New CXMLRPCRequest
Dim fault As Boolean
Dim params As New CAssocArray
Dim result As Variant
Call params.Add("CUSTNO", 1122345)
Call params.Add("FULLNAME", "ЗАО ""Рога и Копыта""")
Call params.Add("MTIME", Now)
fault = rpc.doCall("http://server/services/test/xmlrpc.php", "test.client.echo", params, result)
End Sub
Файлы прилагаю. Прошу конструктивную критику и дополнения.