Показать полную графическую версию : [архив].: NSIS - все вопросы :.
Товарищи, рельно ли средствами NSIS в файле opera_install_log.xml все пути C:\Program Files\Opera поменять на путь прописанный в $INSTDIR или нет? »
Реально :yes:
Возвращаясь к вышеразбираемому вопросу с определением Provider=* в длинющей строке :
Можно и так :
Section
;Provider= может находится и в начале
;StrCpy $0 "Provider=SQLOLEDB;Data Source=W2K3SP2\SQLEXPRESS;Initial Catalog=user_db;Persist Security Info=True;User ID=user;Password=user;"
; и в середине строки
StrCpy $0 "Data Source=W2K3SP2\SQLEXPRESS;Initial Catalog=user_db;Provider=SQLOLEDB;Persist Security Info=True;User ID=user;Password=user;"
${WordFind2X} "$0" "Provider=" ";" "+1" $1
MessageBox MB_OK "$1"
; В $1 будет SQLOLEDB
SectionEnd
Для сокращения кода строку можно и не заносить в переменную... Хотя может это и дурной тон... :)
wolkow70
11-04-2012, 13:44
Реально »
Обнадеживает. Где можно почитать на счет этого. Это же не простой текстовый файл, а .xml ?
kotkovets
11-04-2012, 14:09
wolkow70, в шапке пример парсинга xml
или макросами Word* в папке примеров - большая куча примеров.
Обнадеживает »
Как спросили, так и ответил :biggrin:
Это же не простой текстовый файл, а .xml ? »
Откройте его блокнотом - обычный текстовый файл со множеством строк
Кстати я хотел добавить в справочник пример данного кода (недавно реализовывал для одного проекта)
Чуть причесал и вот сюда выкладываю
Скрипт построчно читает в текстовом файле строки и заменяет определённый текст в строке на ваш
В начале кода:
!include "StrFunc.nsh"
!include "WinMessages.nsh"
${StrRep}
Функция поиска и замены фразы в текстовом файле
Function ReplaceLinesInFile
Banner::show /NOUNLOAD ""
Banner::getWindow /NOUNLOAD
Pop $1
GetDlgItem $2 $1 1030
; Создаём баннер, чтобы видеть прогресс (для наглядности)
Var /Global _FindInFile ; В эту переменную поместим полный путь к файлу, в котором будем производить замену
Var /Global _LineReplace ; В эту переменную поместим строку, которую будем искать и заменять
Var /Global _LineToInsert ; В эту переменную поместим строку, НА которую мы будем заменять искомую строку
Var /Global _CurLineNumber ; В этой переменной храним номер обрабатываемой строки
Var /Global _CurLine ; В этой переменной храним строку, с которой в данный момент сверяем
Var /Global _LineNumbers ; В этой переменной храним количество строк в искомом файле
StrCpy $_FindInFile '$EXEDIR\opera_install_log.xml' ; Заменяем строки в этом файле
StrCpy $_LineReplace 'C:\Program Files\Opera' ; Ищем и заменяем ЭТУ строку
StrCpy $_LineToInsert '$EXEDIR' ; На что будем заменять
${LineSum} "$_FindInFile" $_LineNumbers ; Подсчитываем количество строк
strcpy $_CurLineNumber 0
startLineRead:
intop $_CurLineNumber $_CurLineNumber + 1
SendMessage $2 ${WM_SETTEXT} 0 "STR:Обработка строки $_CurLineNumber [Всего: $_LineNumbers]" ; Смотрим прогресс обработки строк =)
IntCmp $_CurLineNumber $_LineNumbers 0 0 endFunc ; Если номер текущей строки больше количества строк в файле - поиск завершен
${LineRead} "$_FindInFile" "$_CurLineNumber" $_CurLine ; Читаем строку по номеру текущей строки
${WordFind} '$_CurLine' "$_LineReplace" "E+1{" $R0 ; Ищем в строке нужный текст
StrCmp $R0 "1" startLineRead 0 ; Если в строке присутствует искомый текст, выполняем код ниже
${LineFind} "$_FindInFile" "" "" "Insert_Line" ; Вызываем функцию Insert_Line, которая произведёт замену
goto startLineRead
endFunc:
Banner::destroy ; Уничтожаем баннер
FunctionEnd
Function Insert_Line
StrCmp $R8 "$_CurLineNumber" 0 push
${StrRep} $_CurLine "$_CurLine" "$_LineReplace" "$_LineToInsert"
FileWrite $R4 "$_CurLine"
StrCpy $0 SkipWrite
push:
Push $0
FunctionEnd
wolkow70
11-04-2012, 14:31
wolkow70, в шапке пример парсинга xml
или макросами Word* в папке примеров - большая куча примеров. »
Примерно так, да?
!include "XML.nsh"
SetOutPath "$INSTDIR"
${xml::LoadFile} "$INSTDIR\opera_install_log.xml" $0
${xml::GotoPath} "C:\Program Files\Opera" $0
${xml::SetAttribute} "pathPrefix" "$INSTDIR\" $0
${xml::SaveFile} "" $0
${xml::Unload}
Спасибо все за рецепты, сделал так:)
;Тип СУБД
StrCpy $DB_type "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_type" ";" "+1" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "Provider=" ;вычисляем длину отсекаемой части
StrCpy $DB_type "$3" "" $1 ;отсекаем
;Сервер БД
StrCpy $DB_server "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_server" ";" "+2" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "Data Source=" ;вычисляем длину отсекаемой части
StrCpy $DB_server "$3" "" $1 ;отсекаем
;Имя БД
StrCpy $DB_name "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_name" ";" "+3" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "Initial Catalog=" ;вычисляем длину отсекаемой части
StrCpy $DB_name "$3" "" $1 ;отсекаем
;Логин пользователя БД
StrCpy $DB_user "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_user" ";" "+5" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "User ID=" ;вычисляем длину отсекаемой части
StrCpy $DB_user "$3" "" $1 ;отсекаем
;Пароль пользователя БД
StrCpy $DB_password "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_password" ";" "+6" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "Password=" ;вычисляем длину отсекаемой части
StrCpy $DB_password "$3" "" $1 ;отсекаем
;Определяем тип СУБД: MS SQL или Firebird
${If} $DB_type == "SQLOLEDB"
StrCpy $DB_type "MS SQL"
ExecWait "sqlcmd.exe -S $DB_server -d $DB_name -U $DB_user -P $DB_password -i get_version.sql"
${ElseIf} $DB_type == "LCPI.IBProvider"
StrCpy $DB_type "Firebird"
${Else}
MessageBox MB_OK "Не удалось определить тип СУБД!!!"
;Abort
${EndIf}
Хотел еще спросить как присвоить значение переменной:
ExecWait "sqlcmd.exe -S $DB_server -d $DB_name -U $DB_user -P $DB_password -i get_version.sql"
Запрос:
SELECT REV FROM VERSN - возвращает обычное число... Его и нужно сравнить с числом 14525.
wolkow70
11-04-2012, 16:29
K.A.V.,
Попробовал применить приведенную вами функцию. Все работает.
Возникло два вопроса:
1. Если нужно заменить еще значение - назначать новую функцию?
2. Что закомментировать, что бы не было баннера в режиме тихой установки?
wolkow70, сделайте так:
В начале кода
Var _FindInFile ; В эту переменную поместим полный путь к файлу, в котором будем производить замену
Var _LineReplace ; В эту переменную поместим строку, которую будем искать и заменять
Var _LineToInsert ; В эту переменную поместим строку, НА которую мы будем заменять искомую строку
Var _CurLineNumber ; В этой переменной храним номер обрабатываемой строки
Var _CurLine ; В этой переменной храним строку, с которой в данный момент сверяем
Var _LineNumbers ; В этой переменной храним количество строк в искомом файле
!include "StrFunc.nsh"
${StrRep}
В любой секции или функции вызываем функцию сколько угодно раз, только перед новой заменой, если данные отличаются (в каком файле и что заменить) назначайте переменным новые значения
Section /o "Моя секция"
StrCpy $_FindInFile '$EXEDIR\opera_install_log.xml' ; Заменяем строки в этом файле
StrCpy $_LineReplace 'C:\Program Files\Opera' ; Ищем и заменяем ЭТУ строку
StrCpy $_LineToInsert '$EXEDIR' ; На что будем заменять
call ReplaceLinesInFile
SectionEnd
Function ReplaceLinesInFile
${LineSum} "$_FindInFile" $_LineNumbers ; Подсчитываем количество строк
strcpy $_CurLineNumber 0
startLineRead:
intop $_CurLineNumber $_CurLineNumber + 1
IntCmp $_CurLineNumber $_LineNumbers 0 0 endFunc ; Если номер текущей строки больше количества строк в файле - поиск завершен
${LineRead} "$_FindInFile" "$_CurLineNumber" $_CurLine ; Читаем строку по номеру текущей строки
${WordFind} '$_CurLine' "$_LineReplace" "E+1{" $R0 ; Ищем в строке нужный текст
StrCmp $R0 "1" startLineRead 0 ; Если в строке присутствует искомый текст, выполняем код ниже
${LineFind} "$_FindInFile" "" "" "Insert_Line" ; Вызываем функцию Insert_Line, которая произведёт замену
goto startLineRead
endFunc:
FunctionEnd
Function Insert_Line
StrCmp $R8 "$_CurLineNumber" 0 push
${StrRep} $_CurLine "$_CurLine" "$_LineReplace" "$_LineToInsert"
FileWrite $R4 "$_CurLine"
StrCpy $0 SkipWrite
push:
Push $0
FunctionEnd
Напомните пожалуйста, каким образом средствами NSIS манипулировать (удалять, заменять, разрегистрировать) "занятые" системой файлы и ключи реестра.
Например, надо разрегистрировать и удалить файлы Adobe Acrobat Reader_а (надо подчистить "хвосты" после неудачного удаления ПО, перед последующей установкой. Такое часто необходимо.) :
\Program Files\Common Files\Adobe\Acrobat\ActiveX\AcroIEHelper.dll и удалить записи его ключей в реестре и др. подобные файлы...
"классически" разрегистрировать и удалить этот файл не возможно...
(Куча ручных действий с выставлением прав - ессно не годится.)
Помнится был способ с назначением системных прав с полным доступом к файлу и рестартом оболочек (Эксплорера или Тотала) Не нахожу никак эту инфу... Желательно без сторонних средств (в смысле, без доп. утилит и дремучих досовских команд). Интересует способ для любых версий ОС.
kotkovets, наверняка решил бы эту проблему средствами API... :)
Помогите, пожалуйста, с запросом к БД.
Нужно сделать запрос к 2 БД: Firebird 2.1 и MS SQL 2005 и выше.
Почти готов инсталлятор, осталось лишь сделать запрос и сравнить результат с числом...
kotkovets
12-04-2012, 01:17
Напомните пожалуйста, каким образом средствами NSIS манипулировать (удалять, заменять, разрегистрировать) "занятые" системой файлы и ключи реестра. »
если файл не удаляется, то пишем команду:
Delete /Rebootok "File"
этот флаг заставит файл удалится при следущей перезагрузке.Желательно без сторонних средств (в смысле, без доп. утилит и дремучих досовских команд). Интересует способ для любых версий ОС. »
можно удалить файл, но не всегда!, если перезагрузить проводник, а точнее правильнее будет,
УЗНАТЬ какой процесс держит файл и грохать процесс.
читай в справке: » Работа с процессами с помощью NSIS
wolkow70
12-04-2012, 06:04
Напомните пожалуйста, каким образом средствами NSIS манипулировать (удалять, заменять, разрегистрировать) "занятые" системой файлы и ключи реестра. »
Так делаю :
Предварительно резрегистрируем файл, или, если комманда не выполняется через рег-сервер, удаляем все ключи реестра, относимые к dll.
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500
StrCmp $0 0 0 +2
Exec "explorer.exe"
Delete "$INSTDIR\menu.dll"
${If} ${FileExists} "$INSTDIR\menu.dll"
Delete /REBOOTOK "$INSTDIR\menu.dll"
SetRebootFlag true
${Else}
SetRebootFlag false
${EndIf}
kotkovets, wolkow70,
Вы наверное, не так меня поняли или я не точно выразился...
То что вы сказали , зто понятные рядовые ситуации.
Здесь же, файл или ключ "охраняет" защищает система и пока не получишь(не выставишь) системные права и полный доступ к файлу (ключу) - никакой Rebootok ОК не поможет и ничего с файлом и ключом сделать нельзя.
(и никакой процесс этот файл не "держит", а перезапуск оболочки - это будет последний этап для некоторых случаев) .
Интересует , что можно предпринять в таких случаях средствами NSIS ?
Т.е. каким образом организовать назначение системных прав и полного доступа к файлу и ключу реестра, при чём без сторонних утилит (типа Cacls.exe , SubInACL.exe и т.п. )
Почему я и помянул API, т.к. видел инфу как раз по этому поводу с упоминание MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT
Только я в API ни черта не понимаю.
kotkovets
12-04-2012, 11:00
Почему я и помянул API, т.к. видел инфу как раз по этому поводу с упоминание MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT »
это тоже самое, что:
Delete /Rebootok "File"
или
Rename /Rebootok "File" "New_File"
Если параметр dwFlags устанавливает MOVEFILE_DELAY_UNTIL_REBOOT, параметр lpNewFileName - ПУСТО (NULL), функция MoveFileEx регистрирует файл параметра lpExistingFileName для удаления, когда система перезагружается. Если параметр lpExistingFileName относится к каталогу, система удаляет при перезагрузке каталог, только в том случае, если каталог пуст
http://www.vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_movefileex.htm
wolkow70
12-04-2012, 11:07
Товарищи, не пойму почему
IntOp $0 ${SF_SELECTED} | ${SF_RO}
SectionSetFlags ${Install} $0
ТАК РАБОТАЕТ!
IntOp $0 ${SF_SELECTED} | ${SF_RO} | ${SF_BOLD}
SectionSetFlags ${Install} $0
ТАК НЕ РАБОТАЕТ!
kotkovets,
Так как быть то с удалением таких файлов и ключей реестра ?
Delete /Rebootok "File" - файл не удаляет. Что делать с ключами - не ясно...
wolkow70
12-04-2012, 11:12
Еще такую задачку не знаю как проще решить:
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"
Если директория установки не отличается от C:\Program Files\Opera прописанной в файле opera_install_log.xml то менять значение в файле не нужно, если директория установки выбрана другая, то вызвать функцию Call ReplaceLinesInFile. То есть тут проверка нужна не только на $PROGRAMFILES\${PRODUCT_NAME} , но и с учетом буквы диска.
MKN
В этом разделе не пробовали удалять предварительно ключи?
DeleteRegValue HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDlls" "$SYSDIR\px.dll"
wolkow70
12-04-2012, 11:28
Так как быть то с удалением таких файлов и ключей реестра ? »
Попробуйте еще Library.nsh
!include "Library.nsh"
Name "Library Test"
OutFile "Library Test.exe"
InstallDir "$TEMP\Library Test"
Page directory
Page instfiles
XPStyle on
RequestExecutionLevel user
!define TestDLL '"${NSISDIR}\Plugins\LangDLL.dll"'
!define TestEXE '"${NSISDIR}\Contrib\UIs\default.exe"'
Section
!insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib DLL NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib DLL NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib DLL NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib TLB NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib TLB NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib TLB NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib TLB NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLLTLB NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLLTLB NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLLTLB NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLLTLB NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib DLL $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib DLL $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib DLL $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib DLL $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLL $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib TLB $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib TLB $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib TLB $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib TLB $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLLTLB $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLLTLB $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLLTLB $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGDLLTLB $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
!insertmacro InstallLib REGEXE $0 REBOOT_PROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR
!insertmacro InstallLib REGEXE $0 NOREBOOT_PROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR
!insertmacro InstallLib REGEXE $0 REBOOT_NOTPROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR
!insertmacro InstallLib REGEXE $0 NOREBOOT_NOTPROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR
WriteUninstaller $INSTDIR\uninstall.exe
SectionEnd
Section uninstall
!insertmacro UninstallLib DLL NOTSHARED NOREMOVE $INSTDIR\test.dll
!insertmacro UninstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib DLL NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib DLL NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib DLL NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL NOTSHARED NOREMOVE $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib TLB NOTSHARED NOREMOVE $INSTDIR\test.dll
!insertmacro UninstallLib TLB NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib TLB NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib TLB NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib TLB NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREMOVE $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib DLL SHARED NOREMOVE $INSTDIR\test.dll
!insertmacro UninstallLib DLL SHARED REBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib DLL SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib DLL SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib DLL SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL SHARED NOREMOVE $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL SHARED REBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLL SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib TLB SHARED NOREMOVE $INSTDIR\test.dll
!insertmacro UninstallLib TLB SHARED REBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib TLB SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib TLB SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib TLB SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB SHARED NOREMOVE $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB SHARED REBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGDLLTLB SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
!insertmacro UninstallLib REGEXE SHARED NOREMOVE $INSTDIR\test.exe
!insertmacro UninstallLib REGEXE SHARED REBOOT_PROTECTED $INSTDIR\test.exe
!insertmacro UninstallLib REGEXE SHARED NOREBOOT_PROTECTED $INSTDIR\test.exe
!insertmacro UninstallLib REGEXE SHARED REBOOT_NOTPROTECTED $INSTDIR\test.exe
!insertmacro UninstallLib REGEXE SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.exe
SectionEnd
wolkow70,
Без прав и доступа к файлу - ничего не сделать. Об этом и речь.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC