PDA

Показать полную графическую версию : [архив].: NSIS - все вопросы :.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 [75] 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

MKN
17-08-2011, 13:43
Хотелось бы ясности для ситуаци, когда требуется установить драйверы из 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, вдруг я, напишу драйвер, который будет при установке компилировать еще нужные компоненты для установки...
И будут другие пользователи ломать голову, как...

BARS73
18-08-2011, 10:50
подскажите пожалуйста строчку кода для вывода ярлыка на рабочий стол...

kotkovets
18-08-2011, 12:35
подскажите пожалуйста строчку кода »
CreateShortCut "$DESKTOP\Мой_ацкий_линк.lnk" "$INSTDIR\my_proga.exe"

K.A.V.
18-08-2011, 12:57
В дополнение к сообщению 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"

BARS73
18-08-2011, 13:12
а путь к .exe нужно указывать к тому, который распаковался уже?

спасибо!!:) наконец таки разобрался))

BARS73
18-08-2011, 13:38
и еще один вопрос...
как поместить ярлык в пуск->все программы, в отдельной папке естественно?:)

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

BARS73
18-08-2011, 14:40
а для того чтобы вставлять в эту папку Uninstall.exe нужно его создать, верно?
тогда вопрос, что может быть не так в строчке WriteUninstaller "$OUTDIR\uninst.exe", мне выдает ошибку:(

sawe
18-08-2011, 16:03
а для того чтобы вставлять в эту папку Uninstall.exe нужно его создать, верно?
тогда вопрос, что может быть не так в строчке
Код:
WriteUninstaller "$OUTDIR\uninst.exe"
, мне выдает ошибку »

WriteUninstaller "$INSTDIR\uninst.exe"

BARS73
18-08-2011, 16:43
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

в чем здесь может быть ошибка???:(

MKN
18-08-2011, 16:57
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 еще принимается рабочая папка ярлыка.

MKN
18-08-2011, 18:26
kotkovets,
Я обратил внимание не на папку , а на uninst.exe и ярлык для Uninstall.exe. Несуразица в этом. :)

kotkovets
18-08-2011, 19:01
MKN, не заметил, домой торопился :)

silione
20-08-2011, 12:42
Дано:
Установленная программа не оставившая в записей в реестре. Дополнительное строннее ПО для программы работающее только с определенной версией программы.
Условие:
Версия программы содержится в ее исполняемом файле.
Необходимо:
Инсталлятор должен не просто устанавливать стороннее ПО в папку программы (это-то просто), а определить версию программы по версии ее исполняемого файла и установить ПО только если версия подходит, иначе вывести сообщение о необходимости сначала обновить версию программы до необходимой.

Возможно ли в 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.
Я так понимаю, что тут просто проверка должна проходить несколько раз, как это описать в коде?

K.A.V.
20-08-2011, 13:51
silione, в Справочнике по NSIS (http://forum.oszone.net/thread-168287.html) есть категория:
Примеры кодов => Работа со строками

В данной категории посмотрите описания команд StrCmp и IntCmp

Мы уже устали разжевывать по несколько раз то, что можно подчерпнуть из справочника и решить свою задачу самостоятельно, просто вы не внимательно прочитали шапку данной темы, ссылка на справочник там есть...

silione
20-08-2011, 15:00
Спасибо, разобрался :) если кому понадобиться на будущее, то выглядеть это будет например так:

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:


Еще появился вопрос.
Собрал я инсталлятор патча для игры, и хочу чтобы он сам находил путь для установки, но как это сделать если у игры нет записи в реестре или разные репаки игры могут эту запись делать в разных ветках?

K.A.V.
20-08-2011, 15:18
Спасибо, разобрался »
Ну вот и отлично ;)
Кстати представленный вами код можно упростить...учитесь писать более простой код...

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