InstallShield: cannot unregister ActiveX
От: KA it-knowledge-base.blogspot.com
Дата: 16.09.02 15:08
Оценка:
Здравстствуйте, господа.

При деинсталляции дистрибутива, созданного с помощью InstallShield 6.1 Professional, иногда не дерегистрируется (unregister) ActiveX — выдается стандартное диалоговое окно, в котором говорится, что One or more files did not properly self-register, ну и т.д. Причем для DLL'ки с ActiveX'ом утверждается, что не найден один из файлов библиотек, необходимых для выполения данного приложения, а если посмотреть на диск, то — действительно — никаких файлов (в том числе и DLL'ки с ActiveX'ом) уже нет.
Диагноз такой: при деинсталляции сначала удаляются файлы, а потом происходит дерегистрация ActiveX'ов. IMHO это неправильно, но как это объяснить InstallShield'у?
Причем если DLL'ка с ActiveX'ом заблокирована приложением, которое этот объект использует, то все проходит отлично (для соответствующих файлов указано, что они могут быть заблокированы).
Что делать? Кто виноват?

Заранее спасибо

ЗЫ Ручную регистрацию/дерегистрацию ActiveX'а не предлагать!
//
#import <windows.bas>
class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
Re: InstallShield: cannot unregister ActiveX
От: romiro  
Дата: 22.09.02 16:39
Оценка:
Здравствуйте KA, Вы писали:

KA>Здравстствуйте, господа.


KA>При деинсталляции дистрибутива, созданного с помощью InstallShield 6.1 Professional, иногда не дерегистрируется (unregister) ActiveX — выдается стандартное диалоговое окно, в котором говорится, что One or more files did not properly self-register, ну и т.д. Причем для DLL'ки с ActiveX'ом утверждается, что не найден один из файлов библиотек, необходимых для выполения данного приложения, а если посмотреть на диск, то — действительно — никаких файлов (в том числе и DLL'ки с ActiveX'ом) уже нет.

KA>Диагноз такой: при деинсталляции сначала удаляются файлы, а потом происходит дерегистрация ActiveX'ов. IMHO это неправильно, но как это объяснить InstallShield'у?
KA>Причем если DLL'ка с ActiveX'ом заблокирована приложением, которое этот объект использует, то все проходит отлично (для соответствующих файлов указано, что они могут быть заблокированы).
KA>Что делать? Кто виноват?

KA>Заранее спасибо


KA>ЗЫ Ручную регистрацию/дерегистрацию ActiveX'а не предлагать!


поставить разрегистрацию перед удалением файлов
посмотри порядок выполнения энжайном операций, которые ты поставил...
Re[2]: InstallShield: cannot unregister ActiveX
От: KA it-knowledge-base.blogspot.com
Дата: 23.09.02 08:32
Оценка:
Здравствуйте romiro, Вы писали:

KA>>При деинсталляции дистрибутива, созданного с помощью InstallShield 6.1 Professional, иногда не дерегистрируется (unregister) ActiveX — выдается стандартное диалоговое окно, в котором говорится, что One or more files did not properly self-register, ну и т.д.


[skipped]

R>поставить разрегистрацию перед удалением файлов


Это где? Self-registered и may be locked ключики стоят.

R>посмотри порядок выполнения энжайном операций, которые ты поставил...


Как я уже написал, то сначала происходит удалений , а уж потом разрегистрация (!)...
//
#import <windows.bas>
class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
Re: InstallShield: cannot unregister ActiveX
От: KA it-knowledge-base.blogspot.com
Дата: 18.12.02 15:42
Оценка:
KA>При деинсталляции дистрибутива, созданного с помощью InstallShield 6.1 Professional, иногда не дерегистрируется (unregister) ActiveX — выдается стандартное диалоговое окно, в котором говорится, что One or more files did not properly self-register, ну и т.д. Причем для DLL'ки с ActiveX'ом утверждается, что не найден один из файлов библиотек, необходимых для выполения данного приложения, а если посмотреть на диск, то — действительно — никаких файлов (в том числе и DLL'ки с ActiveX'ом) уже нет.
[...]
KA>Что делать? Кто виноват?

В данном случае виноват, как мне кажется, InstallShield.
Если отследить происходящее при деинсталляции, то выполняется следующее:
1. Вызывается OnUninstalling-обработчик для ActiveX-компонента (DLL'ка для ActiveX'а все еще на месте).
2. Удаляется DLL'ка.
3. Вызывается OnUninstalled-обрабтчик для ActiveX-компонента.
4. Выполняется дерегистрация для ActiveX'а (!).
Даже выполнение действия 4 перед действием 2 не поможет, поскольку "обвиняемый" уже прибил все DLL'ки от которых DLL'ка с ActiveX'ом зависит.
Данное поведение наблюдалось вплоть до версии 6.31. Дальнейшие попытки сговориться с InstallShild'ом более поздней версии не предпринимались за неимением оной.
Вполне может быть, что вину InstallShield'а я немножко преувеличиваю, поскольку в фазе инсталляции (моего дистрибутива) имеются некоторые навороты.

Тем не менее, более-менее подходящее решение я все-таки нашел.
Необходимо просто заблокировать каким-либо способом DLL'ку с ActiveX'ом, а также все DLL'ки, от которых первая зависит.
1. В OnMoving-обработчике вызываем UseDLL для DLL'ки с ActiveX'ом.
2. В OnMoved-обработчике "отпускаем" DLL'ку.
Вот такие дела... Надеюсь, что в ISPro7 хоть этот глюк (?) исправлен Если это действительно глюк...
//
#import <windows.bas>
class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.