@Otrub

Как создать COM объект и вызвать его методы в NSIS?

Использую 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
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы