2016-05-30 7 views
-1

Использование Wix 3.10.2 для создания моего установщика продукта. У меня много проблем с удалением драйвера. Я слежу за примерами в сети, насколько я могу их понять, и я могу установить драйвер. Проблема заключается в удалении - они этого не делают.Не удается удалить драйвер

Вот соответствующий раздел из product.wxs:

<Directory Id="MYDRIVER" Name="myDriver"> 
    <!-- Windows 7 --> 
    <Component Id="myDriver_Win7" Guid="..." KeyPath="yes" SharedDllRefCount="yes" Win64="$(var.Win64)"> 
     <Condition>VersionNT = 601</Condition> 
     <File Id="myDriver.inf_win7" Name="myDriver.inf" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win7Release\myDriver.inf" /> 
     <File Id="myDriver.sys_win7" Name="myDriver.sys" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win7Release\myDriver.sys" /> 
     <File Id="myDriver_.cat_win7" Name="myDriver_.cat" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win7Release\myDriver_.cat" /> 
     <Driver AddRemovePrograms="no" DeleteFiles="yes" Legacy="yes" PlugAndPlayPrompt="no" Sequence="4" xmlns="http://schemas.microsoft.com/wix/DifxAppExtension" /> 
    </Component> 
    <!-- Windows 8.1, Server 2012R2 --> 
    <Component Id="myDriver_Win8.1" Guid="..." KeyPath="yes" SharedDllRefCount="yes" Win64="$(var.Win64)"> 
     <Condition>VersionNT = 603</Condition> 
     <File Id="myDriver.inf_win8.1" Name="myDriver.inf" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win8.1Release\myDriver.inf" /> 
     <File Id="myDriver.sys_win8.1" Name="myDriver.sys" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win8.1Release\myDriver.sys" /> 
     <File Id="myDriver_.cat_win8.1" Name="myDriver_.cat" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win8.1Release\myDriver_.cat" /> 
     <Driver AddRemovePrograms="no" DeleteFiles="yes" Legacy="yes" PlugAndPlayPrompt="no" Sequence="4" xmlns="http://schemas.microsoft.com/wix/DifxAppExtension" /> 
    </Component> 
</Directory> 

<Feature Id="extDevice" AllowAdvertise="no" ConfigurableDirectory="INSTALLDIR" Level="101" Title="External USB Device"> 
... 
<ComponentRef Id="myDriver_Win7" /> 
<ComponentRef Id="myDriver_Win8.1" /> 
... 
</Feature> 

Который устанавливает соответствующий драйвер, в зависимости от версии ОС. Деинсталляция, я бы подумал, просто делает обратное.

Насколько я понимаю из чтения https://msdn.microsoft.com/en-us/library/windows/hardware/ff553591%28v=vs.85%29.aspx, что DeleteFiles теперь ничего не делает (для OS's> win7).

Из ушедшей эпохи у нас также было специальное действие (портировано с установочного экрана), в котором пытались удалить устаревшие версии драйвера. Код от product.wxs который устанавливает пользовательское действие:

<CustomAction Id="CA_DeleteDriverSysFile" BinaryKey="CustomActions_dll" DllEntry="DeleteDriverSysFile" /> 

<InstallExecuteSequence> 
... 
<Custom Action="CA_DeleteDriverSysFile" After="RemoveFolders">(REMOVE="ALL") Or (feature selection conditions)</Custom> 
... 
</InstallExecuteSequence> 

И С # код:

[CustomAction] 
public static ActionResult DeleteDriverSysFile(Session session) 
{ 
    return DoDeleteDriverSysFile(session, MYDRIVER_SYS); 
} 

static ActionResult DoDeleteDriverSysFile(Session session, string driverFilen) 
{ 
    try 
    { 
     string driverPath = Path.Combine(new string[] { Environment.SystemDirectory, "drivers", driverFilen }); 
     File.Delete(driverPath); 
     return ActionResult.Success; 
    } 
    catch (Exception e) 
    { 
     return ActionResult.Failure; 
    } 
} 

Довольно простой, но, код ActionResult.Failure всегда возвращается .. не может удалить файл из каталога драйверов, даже зарегистрировался как администратор.

Что я делаю неправильно здесь и что делать, чтобы удалить драйвер?

Связанный - Как исправить окно сервера 2016 для Windows, в котором установлен этот драйвер и где сейчас удаляется удаление?

+2

Вы пытались маркировать свой CustomAction как Execute = «отложен»? Возможно, вы захотите использовать session.Log («Исключить удаление системного драйвера: {0}», e.Message); перед возвратом ActionResult.Failure, поэтому у вас есть некоторая информация в журнале msi при запуске msiexec с/l * v log.txt –

+1

Не забывайте о Impersonate = "no", когда вы будете пытаться добавить Execute = "отложенные ». –

+0

^^ Те сделали трюк! – Jon

ответ

0

Брайан и Сутармин ответили на вопрос. У меня был установлен ЦС для немедленного выполнения и как пользователь, выполняющий установку. Я также добавил InstallScope="perMachine" в тег Package.

Для исправления машины я пошел в диспетчер устройств, включил View-> Hidden и щелкнул правой кнопкой мыши удаленные драйверы. Затем удалите программное обеспечение через обычный канал.

 Смежные вопросы

  • Нет связанных вопросов^_^