Использую SOAP toolkit, чтобы обращаться к веб-сервису, что удобно, потому что есть COM интерфейс.
Схема такая:
1. Запускаю скрипт SoapClient.vbs, передаю ему содержимое запроса в файле $tempFile и условный метод $queryMethod'.
nsExec::ExecToStack '$0\cscript.exe //NOLOGO $\"$TEMP\SoapClient.vbs$\" $tempFile $queryMethod'
2. Скрипт SoapClient.vbs читает содержимое файла $tempFile, выбирает метод, исходя из параметра, вызывает его и ответ кладет обратно в $tempFile.
Dim resp
Set objArgs= Wscript.Arguments
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile(objArgs(0), 1, False, -1)
content = file.ReadAll
file.Close
Set soapclient = CreateObject ("MSSOAP.SoapClient30")
SOAPClient.mssoapinit ("http://localhost:80/service?wsdl")
If objArgs(1) = "getLic" Then
resp = SOAPClient.GetLic(content)
ElseIf objArgs(1) = "setLic" Then
resp = SOAPClient.SetLic(content)
End If
Set soapclient = Nothing
Set file = fso.OpenTextFile(objArgs(0), 2, False, -1)
file.WriteLine(resp)
file.Close
3. NSIS читает файл, profit!
Как создать подобные сущности внутри NSIS и не использовать VBS?
з.ы. Были попытки сделать, но матчасть у меня отсутствует (нет полного понимания происходящего в коде), разобраться не получилось. Дело в том, что есть еще один скрипт, и он тоже использует COM интерфейсы. Хотелось бы его реализовать в NSIS по аналогии в будущем.
!define IID_StdOle '{00020430-0000-0000-C000-000000000046}'
!define IID_IDispatch '{00020400-0000-0000-C000-000000000046}'
!define IID_IUnknown '{00000000-0000-0000-C000-000000000046}'
!define IID_NULL '{00000000-0000-0000-0000-000000000000}'
!define CLSCTX_SERVER 0x015
!define LOCALE_SYSTEM_DEFAULT 0x800
Section
DetailPrint "== CLSIDFromProgID =="
System::Call `Ole32::CLSIDFromProgID(w,&g16)i ("MSSOAP.SoapClient30",.r0).r2`
DetailPrint "== CoCreateInstance =="
System::Call `Ole32::CoCreateInstance(g r0,i 0,i ${CLSCTX_SERVER},g '${IID_IDispatch}',*i .r1) i .r2`
DetailPrint "== IDispatch::GetTypeInfoCount =="
System::Call `$1->3(*i .r3)i .r2`
DetailPrint "== IDispatch::GetTypeInfo =="
System::Call `$1->4(i 0,i ${LOCALE_SYSTEM_DEFAULT},*g .r3)i .r2`
DetailPrint "== Oleaut32::SysAllocString =="
System::Call `Oleaut32::SysAllocString(w "mssoapinit")i .r4`
DetailPrint "== IDispatch::GetIDsOfNames =="
System::Call `$1->5(g ${IID_NULL},*i r4,i 1,i ${LOCALE_SYSTEM_DEFAULT},*i .r3)i .r2`
DetailPrint "== mssoapinit =="
System::Call `$1->1(w "http://localhost:80/service?wsdl")t .r2`
DetailPrint "== Oleaut32::SysFreeString =="
System::Call `Oleaut32::SysFreeString(*i r4)`
DetailPrint "== IUnknown::Release =="
System::Call `$1->2()i .r2`
DetailPrint " RefCount=$2"
SectionEnd