Плагин NsisIIS дает сбой и падает при выполнении удаления виртуального каталога - PullRequest
1 голос
/ 05 марта 2012

Я пытаюсь заставить его работать в течение нескольких дней, но все же безуспешно.

ОС: Win7 SP2 Ent x64 и W2k8 R2 SP1 Datacenter x64.

Я гуглил, и единственное реальное предложение - это тройная проверка входных параметров для функции DeleteVDir. Я делал это бесчисленное количество раз, но не смотря ни на что - плагин аварийно завершает работу и, следовательно, установщик тоже.

Итак -

Может ли кто-нибудь объяснить пошагово (отформатировано для манекенов) - что мне нужно проверить и точно, какие параметры мне нужно ввести и какое состояние системы мне нужно, чтобы успешно удалить виртуальный каталог.

В настоящее время у меня есть такой звонок:

DetailPrint "Deleting Virtual Directory..."
NsisIIS::DeleteVDir /NOUNLOAD "name_of_virtual_directory" "physical_path_of_virtual_directory"
Pop $0

1 Ответ

1 голос
/ 06 марта 2012

Насколько я могу судить, NsisIIS :: DeleteVDir принимает только один параметр, а не два параметра (/ NOUNLOAD не считается параметром)

Другая возможная проблема заключается в том, что эта строка ограничена 100 символами. Если ваше имя длиннее, вы должны отправить сообщение об ошибке здесь . (При быстром взгляде на код кажется, что он теряет много памяти, возможно, вы также захотите сообщить об ошибке)

Также возможно вызвать интерфейс COM с помощью системного плагина, код может выглядеть примерно так:

!include LogicLib.nsh
!define IID_IADsContainer {001677d0-fd16-11ce-abc4-02608c9e7553}

StrCpy $9 "NameOfItemToDelete" ;Edit this!
System::Call 'ActiveDS::ADsGetObject(w "IIS://localhost/w3svc/1/Root", g "${IID_IADsContainer}", *i.r1)i.r0'
${If} $0 = 0
    System::Call 'OleAut32::SysAllocString(w "IIsWebVirtualDir")i.r2'
    System::Call 'OleAut32::SysAllocString(w "$9")i.r3'
    ${If} $2 <> 0
    ${AndIf} $3 <> 0
        System::Call '$1->15(ir2,ir3)i.r0' ;IADsContainer::Delete
        ;If $0 is 0 then it succeeded, otherwise it failed
        System::Call 'OleAut32::SysFreeString(ir2)'
        System::Call 'OleAut32::SysFreeString(ir3)'
    ${EndIf}
    System::Call '$1->2()' ;Release
${EndIf}

(Примечание. Я не тестировал этот код, поскольку у меня нет настройки IIS для тестирования)

...