Определение проблемы:
Отключается на некоторое время во время отмены регистрации COM и говорит The setup was unable to automatically close all requested applications. Please ensure that the applications holding files in use are closed before continuing with the installation
, Но на самом деле мое расширение успешно выгружено и удалено.
Определение среды:
Я создал какое-то фиктивное расширение пространства имен оболочки для тестов. Это реализует IContextMenu
и все методы возвращаютсяS_OK
и больше ничего не делать и RGS файл
HKCR
{
xxx.sergz.dummyShellExt.1 = s 'DummyNSE Class'
{
CLSID = s '{6C0FBE00-9898-4BB0-806F-3ED7D2F1170D}'
}
xxx.sergz.dummyShellExt = s 'DummyNSE Class'
{
CurVer = s 'xxx.sergz.dummyShellExt.1'
}
NoRemove CLSID
{
ForceRemove {6C0FBE00-9898-4BB0-806F-3ED7D2F1170D} = s 'DummyNSE Class'
{
ProgID = s 'xxx.sergz.dummyShellExt.1'
VersionIndependentProgID = s 'xxx.sergz.dummyShellExt'
ForceRemove Programmable
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
TypeLib = s '{3DC947F0-6691-4043-B414-29F749209905}'
Version = s '1.0'
}
}
NoRemove Directory
{
NoRemove Background
{
NoRemove ShellEx
{
NoRemove ContextMenuHandlers
{
ForceRemove DummyShellExt = s '{6C0FBE00-9898-4BB0-806F-3ED7D2F1170D}'
}
}
}
}
}HKLM
{
NoRemove Software
{
NoRemove Microsoft
{
NoRemove Windows
{
NoRemove CurrentVersion
{
NoRemove Shell Extensions
{
NoRemove Approved
{
val '{6C0FBE00-9898-4BB0-806F-3ED7D2F1170D}' = s 'xxx.sergz Dummy shell extension.'
}
}
}
}
}
}
}
я выбираю Professional
установщик и добавил только мой файл DLL. По свойствам файла Registration
Я выбираю вкладку Auto register file...
, Extract registration info...
а также Synchronization
является Enabled
, В Product Information->Install Parameters->PackageType
я выбираю 64-bit package for x64...
,
Сейчас я строю MSI и устанавливаю расширение.
Запустите проводник и щелкните правой кнопкой мыши где-нибудь на фоне папки. Согласно моему журналу мое расширение загружено и является DLL_PROCESS_ATTACH и несколько раз DLL_THREAD_ATTACH.
Я снова запускаю MSI и выбираю Remove
, Это говорит о том, что вы должны закрыть ... applications are using files...
и есть только Windows Explorer
в списке. я выбираю Automatically close ...
и нажмите ОК.
Все окна Explorer закрыты, но кажется, что Explorer не был закрыт.
Статус «Завершение работы приложений», по моему логу dll уже выгружен. Проблема здесь. DLL уже выгружена, но MSI все еще чего-то ждет, а затем говорит The setup was unable to automatically close all requested applications. Please ensure that the applications holding files in use are closed before continuing with the installation
,
Я нажимаю OK, и процесс продолжается, и моя DLL успешно удаляется в конце.
Я использую Windows 8 64bit.
Каковы причины этого ожидания и сообщение о том, что приложения не могут быть закрыты. Как я могу понять это?
Правильно, это не сработает, очень вероятно, что расширение оболочки будет загружено, а MSI не убьет Explorer.exe. И вы бы этого не хотели, это скорее ужасное зрелище для пользователя.
Вам нужно будет использовать альтернативный способ, чтобы удалить / зарегистрировать расширение. Не ясно, что может означать «Профессиональный установщик». Но вы всегда можете отключить / зарегистрировать COM-сервер, изменив реестр самостоятельно, а не предоставляя это DLL. На самом деле это рекомендуемый способ. Вы уже знаете ключи реестра из вашего файла .rgs. Вы также можете использовать харвестер Heat.exe из набора инструментов WiX. DLL необходимо удалить, отложив ее при следующем входе в систему, добавив ее в раздел реестра PendingFileRenameOperations. Проверьте правильность процедуры в вашем инструменте создателя установщика.
Других решений пока нет …