Показать полную графическую версию : [архив].: NSIS - все вопросы :.
Хотелось бы ясности для ситуаци, когда требуется установить драйверы из NSIS инсталлятора. И не только драйверы оборудования, но и специфические драйверы, не имеющие HWID (во всяком случае, явного...). ( драйверы для видеоприложений, программ записи дисков и пр.)
В частности интересует установка, когда имеются такие сочетания файлов :
К примеру - drv.sys и drv.inf. (ну, это болеее-менее ясно...) , один только drv.sys, drv.sys и "вспомогательная" DLL, вообще какой нибудь странный драйвер типа 001.fcl и т.п.
Ессно для "разноразрядных" ОС всех типов.
Специальных плагинов для установки драйверов, вроде как нет, а "devcon и dpinst" утилиты годятся только для установки драйверов оборудования...
Ну, при иналичии INF файла наверное можно использовать команду (?) :
rundll32.exe setupapi.dll,InstallHinfSection DefaultInstall 0 Путь\drv.inf
А если нет INF ? Как вообще устанавливаются такие драйверы ?
kotkovets
17-08-2011, 14:09
А если нет INF ? Как вообще устанавливаются такие драйверы ? »
По такому поводу, как - нужно спрашивать у разраба драйвера, что в реестр писать, регистрировать и т.д :)
А по INF файлу, я иногда ставлю драйвера к тюнеру вот так, проверял тока XP
!define ERROR_NO_SUCH_DEVINST -536870389
!define SPOST_NONE 0
!define SPOST_PATH 1
!define SPOST_URL 2
!define SP_COPY_DELETESOURCE 0x1
!define SP_COPY_REPLACEONLY 0x2
!define SP_COPY_NOOVERWRITE 0x8
!define SP_COPY_OEMINF_CATALOG_ONLY 0x40000
!define CM_LOCATE_DEVNODE_NORMAL 0x00000000
!define CM_REENUMERATE_NORMAL 0
!define InstallDriver "!insertmacro InstallDriverCall"
!include "logiclib.nsh"
!macro InstallDriverCall HID INFPATH INFDIR
System::Store S
Push `${INFDIR}`
Push `${INFPATH}`
Push `${HID}`
DetailPrint "Rescan drivers..."
System::Call "cfgmgr32::CM_Locate_DevNode(*i.r0, n, i${CM_LOCATE_DEVNODE_NORMAL}) i.r1"
${If} $1 <> 0
StrCpy $1 1
${Else}
System::Call "cfgmgr32::CM_Reenumerate_DevNode (ir0, i${CM_REENUMERATE_NORMAL}) i.r1"
${IfThen} $1 <> 0 ${|}StrCpy $1 2${|}
${EndIf}
${If} $1 = 0
DetailPrint "Installing the driver..."
System::Call "newdev::UpdateDriverForPlugAndPlayDevices(i0, ts, tss, i0, *i0)?ei.s"
Pop $0
IntCmp $0 ${ERROR_NO_SUCH_DEVINST} 0 +2 +2
DetailPrint "The device is not plugged in, cannot update the driver."
${If} $0 = 0
System::Call "setupapi::SetupCopyOEMInf(ts, ts, i${SPOST_PATH}, i0, i0, i0, *i0, tn)i.r0"
IntCmp $0 1 0 +2 +2
DetailPrint "Istall driver success!"
IntCmp $0 0 0 +2 +2
DetailPrint "Istall driver error!"
${EndIf}
${ElseIf} $1 = 1
DetailPrint "An error occurred while trying to get the device instance for the machine"
${ElseIf} $1 = 2
DetailPrint "An error occurred while trying to refresh the device list"
${EndIf}
System::Store L
!macroend
OutFile InstDrv.exe
ShowInstDetails show
Section
# ${InstallDriver} "HWID" "путь к inf файлу" "папка с дровами"
${InstallDriver} "PCI\VEN_1131" "$EXEDIR\beholder.inf" "$EXEDIR"
SectionEnd
MKN, вдруг я, напишу драйвер, который будет при установке компилировать еще нужные компоненты для установки...
И будут другие пользователи ломать голову, как...
подскажите пожалуйста строчку кода для вывода ярлыка на рабочий стол...
kotkovets
18-08-2011, 12:35
подскажите пожалуйста строчку кода »
CreateShortCut "$DESKTOP\Мой_ацкий_линк.lnk" "$INSTDIR\my_proga.exe"
В дополнение к сообщению kotkovets
Страничка справки по команде из будущей версии "Справочника по NSIS" ;)
CreateShortCut: создаём ярлыки
Команда "CreateShortCut" предназначена для создания ярлыков.
Расположение_ярлыка.lnk Путь_до_файла.exe [параметры_запуска [Файл_иконки [Индекс_иконки [Тип_окна [Горячая_клавиша [Описание_ярлыка]]]]]]
В параметре "Тип окна" вы можете указать одно из значений:
SW_SHOWNORMAL
SW_SHOWMAXIMIZED
SW_SHOWMINIMIZED
Создаём обычный ярлык:
CreateShortCut "$DESKTOP\Справочник по NSIS.lnk" "$WINDIR\NSIS_Help.chm"
Ярлык с файлом иконки:
CreateShortCut "$DESKTOP\Справочник по NSIS.lnk" "$WINDIR\NSIS_Help.chm" "" "$WINDIR\Explorer.exe" "2"
Ярлык с сочетанием клавиш ALT+F5 для запуска и с описанием ярлыка:
CreateShortCut "$DESKTOP\Справочник по NSIS.lnk" "$WINDIR\NSIS_Help.chm" "" "" "" "" "ALT|F5" "Это единственный русскоязычный справочник по NSIS"
а путь к .exe нужно указывать к тому, который распаковался уже?
спасибо!!:) наконец таки разобрался))
и еще один вопрос...
как поместить ярлык в пуск->все программы, в отдельной папке естественно?:)
Krinkels
18-08-2011, 13:56
как поместить ярлык в пуск->все программы, в отдельной папке естественно? »
Ну для начала нужно там создать саму папку, а потом туда поместить ярлык.
Вот пример:
CreateDirectory "$SMPROGRAMS\${APPNAME}\"
CreateShortCut "$SMPROGRAMS\${APPNAME}\Packers Show.lnk" "$INSTDIR\PackersShow.exe"
CreateShortCut "$SMPROGRAMS\${APPNAME}\Help.lnk" "$INSTDIR\Help.chm"
CreateShortCut "$SMPROGRAMS\${APPNAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
kotkovets
18-08-2011, 14:14
Дополненение к сообщению Krinkels :), разместить ярлыки в меню в пуск->все программы
для текушего пользователя, перед созданием ярлыков (по умолчанию NSIS создает ярлыки для текущего пользователя)
SetShellVarContext current
для всех пользователей:
SetShellVarContext all
Небольшой пример перенаправления папки пользователя:
SetShellVarContext current
MessageBox MB_OK $DESKTOP
SetShellVarContext all
MessageBox MB_OK $DESKTOP
а для того чтобы вставлять в эту папку Uninstall.exe нужно его создать, верно?
тогда вопрос, что может быть не так в строчке WriteUninstaller "$OUTDIR\uninst.exe", мне выдает ошибку:(
а для того чтобы вставлять в эту папку Uninstall.exe нужно его создать, верно?
тогда вопрос, что может быть не так в строчке
Код:
WriteUninstaller "$OUTDIR\uninst.exe"
, мне выдает ошибку »
WriteUninstaller "$INSTDIR\uninst.exe"
WriteUninstaller "$INSTDIR\uninst.exe" »
а в самой папке куда устанавливается программа не нужно что ли создавать uninst.exe?
Section
SetOutPath "C:\Program Files\MIDA15TOOL2"
File /r D:\Pavel\proba\Release\*.*.
CreateShortCut "$DESKTOP\PipeDataVisualizer.lnk" "C:\Program Files\MIDA15TOOL2\PipeDataVisualizer.exe"
WriteUninstaller "$OUTDIR\uninst.exe"
CreateDirectory "$SMPROGRAMS\MIDA15TOOL\"
CreateShortCut "$SMPROGRAMS\MIDA15TOOL\Packers Show.lnk" "$INSTDIR\PipeDataVisualizer.exe"
CreateShortCut "$SMPROGRAMS\${APPNAME}\Help.lnk" "$INSTDIR\Help.chm"
CreateShortCut "$SMPROGRAMS\MIDA15TOOL\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
SectionEnd
в чем здесь может быть ошибка???:(
BARS73,
Наверное в несуразице :
WriteUninstaller "$OUTDIR\uninst.exe" и
CreateShortCut "$SMPROGRAMS\MIDA15TOOL\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
и лишний пробел в 3 строке после File
kotkovets
18-08-2011, 18:05
в чем здесь может быть ошибка??? »
Ошибка в том, что вы лишнюю точку в команде поставили:
File /r "D:\Pavel\proba\Release\*.*" # включить только файлы
И вы не добавили странички деинсталяции, ну как минимум, для MUI:
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
Наверное в несуразице :
WriteUninstaller "$OUTDIR\uninst.exe" »
$OUTDIR - Текущая выходная папка
Устанавливается явно через SetOutPath или не явно с помощью StrCpy, ReadRegStr, ReadINIStr.
А значением $OUTDIR еще принимается рабочая папка ярлыка.
kotkovets,
Я обратил внимание не на папку , а на uninst.exe и ярлык для Uninstall.exe. Несуразица в этом. :)
kotkovets
18-08-2011, 19:01
MKN, не заметил, домой торопился :)
Дано:
Установленная программа не оставившая в записей в реестре. Дополнительное строннее ПО для программы работающее только с определенной версией программы.
Условие:
Версия программы содержится в ее исполняемом файле.
Необходимо:
Инсталлятор должен не просто устанавливать стороннее ПО в папку программы (это-то просто), а определить версию программы по версии ее исполняемого файла и установить ПО только если версия подходит, иначе вывести сообщение о необходимости сначала обновить версию программы до необходимой.
Возможно ли в NSIS осуществить проверку версии программы по ее *.exe файлу, и если возможно, то как?
---------------------------------------------
Уже понял, что возможно:
GetDllVersion "$INSTDIR\XXX.exe" $R0 $R1
IntOp $R2 $R0 / 0x00010000
IntOp $R3 $R0 & 0x0000FFFF
IntOp $R4 $R1 / 0x00010000
IntOp $R5 $R1 & 0x0000FFFF
StrCpy $R1 "$R2.$R3.$R4.$R5"
После чего в $R1 получаем версию.
Но я не пойму как это использовать, надо ведь задать переменные и провести сравнение, как это будет в коде выглядеть?
И еще допустим версии много, но нужно разрешить установку не на одной конкретной версии, а на нескольких конкретных, т.е. например программа может быть версии от 1.00 до 1.32, а инсталлятор должен разрешать установку только на версии 1.25, 1.27, и 1.31.
Я так понимаю, что тут просто проверка должна проходить несколько раз, как это описать в коде?
silione, в Справочнике по NSIS (http://forum.oszone.net/thread-168287.html) есть категория:
Примеры кодов => Работа со строками
В данной категории посмотрите описания команд StrCmp и IntCmp
Мы уже устали разжевывать по несколько раз то, что можно подчерпнуть из справочника и решить свою задачу самостоятельно, просто вы не внимательно прочитали шапку данной темы, ссылка на справочник там есть...
Спасибо, разобрался :) если кому понадобиться на будущее, то выглядеть это будет например так:
GetDllVersion "$INSTDIR\xxx.exe" $R0 $R1 # где xxx.exe - имя исполняемого файла программы
IntOp $R2 $R0 / 0x00010000
IntOp $R3 $R0 & 0x0000FFFF
IntOp $R4 $R1 / 0x00010000
IntOp $R5 $R1 & 0x0000FFFF
StrCpy $R1 "$R2.$R3.$R4.$R5" # в переменную $R1 записывается версия программы
StrCpy $1 "yyy" # в переменную $1 записываем версию программы при которой установка возможна
StrCpy $2 "zzz" # в переменную $2 записываем версию программы при которой установка возможна
StrCpy $3 "kkk" # в переменную $3 записываем версию программы при которой установка возможна
StrCmp $R1 $1 0 +2
Goto Next
StrCmp $R1 $2 0 +2
Goto Next
StrCmp $R1 $3 0 +2
Goto Next
MessageBox MB_OK "Версия программы не совместима с этим дополнением! Вам нужна версия yyy, или zzz, или kkk."
Abort
Next:
Еще появился вопрос.
Собрал я инсталлятор патча для игры, и хочу чтобы он сам находил путь для установки, но как это сделать если у игры нет записи в реестре или разные репаки игры могут эту запись делать в разных ветках?
Спасибо, разобрался »
Ну вот и отлично ;)
Кстати представленный вами код можно упростить...учитесь писать более простой код...
GetDllVersion "$INSTDIR\xxx.exe" $R0 $R1 # где xxx.exe - имя исполняемого файла программы
IntOp $R2 $R0 / 0x00010000
IntOp $R3 $R0 & 0x0000FFFF
IntOp $R4 $R1 / 0x00010000
IntOp $R5 $R1 & 0x0000FFFF
StrCpy $R1 "$R2.$R3.$R4.$R5" # в переменную $R1 записывается версия программы
StrCmp $R1 "yyy" Next 0
StrCmp $R1 "zzz" Next 0
StrCmp $R1 "kkk" Next 0
MessageBox MB_OK "Версия программы не совместима с этим дополнением! Вам нужна версия yyy, или zzz, или kkk."
Abort
Next:
как это сделать если у игры нет записи в реестре или разные репаки игры могут эту запись делать в разных ветках? »
Как вариант, проверять наличие какого-либо файла в каталоге, куда устанавливается игра по-умолчанию
Также с помощью ProcMon можно отследить что прописывает установщик игры в реестр, думаю как-никак какой-нибудь да след за собой оставляет, мало вериться в то, что программа установки нигде не прописывает путь для установки игры...
P.S.
В ветке "Uninstall" смотрели?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC