.: NSIS - все вопросы :. часть 2.

Ответить
 • Просмотры: 19
Аватара пользователя
MKN

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MKN »

Цитата Dodakaedr:



Как записать путь в таком виде в реестре?
.: NSIS - все вопросы :. часть 2.




Используйте команду GetFullPathName с ключем /SHORT, учтите, что в пути не должно быть символов типа "%1", в команду посылаете только путь, а после преобразования пути уже можете добавить к нему остальное



Код:

Код: Выделить всё

GetFullPathName /SHORT $0 "$PROGRAMFILES"
StrCpy $0 '$0 "%1"'
MessageBox MB_OK|MB_ICONINFORMATION "$0"

+Эту команду можно выполнять только если директория существует, в противном случае (если папки не существует) - вам вернётся пустое значение

Протестируйте в общем



Есть также WinAPI функция, делающая тоже самое



Код:

Код: Выделить всё

StrCpy $0 '$PROGRAMFILES'
System::Call 'kernel32::GetShortPathName(t r0, t .r0, i ${NSIS_MAX_STRLEN}) i .r1'
StrCpy $0 '$0 "%1"'
MessageBox MB_OK|MB_ICONINFORMATION "$0"
Аватара пользователя
K.A.V.

Re: .: NSIS - все вопросы :. часть 2.

Сообщение K.A.V. »

Name "NSIS archive folder"



Page instfiles



OutFile "NSIS archive folder.exe"

InstallDir "$EXEDIR\NSIS archive folder"



SetCompressor /SOLID lzma



!define RUNASADMIN



!ifndef RUNASADMIN

RequestExecutionLevel 'admin' ;Require admin rights on NT6+ (When UAC is turned on)

!else

RequestExecutionLevel 'admin'

!endif



!include "FileFunc.nsh"

!include "LogicLib.nsh"

!include "TextFunc.nsh"

!include "WordFunc.nsh"



!insertmacro GetSize



Function .onInit

File "/oname=$TEMP\7za.exe" "7za\7za.exe"

FunctionEnd



var /global InSize

var /global OutSize

var /global SZ_1

var /global SZ_2

var /global SZ_3



Section "Program" P1



DetailPrint "Compressored filder..."



Setoutpath "$INSTDIR"



WriteINIStr "$INSTDIR\CatsSoft © 2015.url" "InternetShortcut" "URL" "
http://portableroapps.blogspot.com/
"



${If} ${FileExists} "$INSTDIR\CatsSoft © 2015.url"

nsExec::ExecToLog '"$TEMP\7za.exe" a "archive.7z" "$INSTDIR"'

${EndIf}

Delete "$TEMP\7za.exe"



${GetSize} "$INSTDIR" "/M=*.* /S=0K" $SZ_1 $SZ_2 $SZ_3

StrCpy $InSize 1024

StrCpy $InSize $SZ_1 / 1024

StrCpy $0 0

StrCpy $InSize $SZ_1

StrCpy $1 $InSize



IntCmp $1 1024 +3 +1 +3

StrCpy $1 "$1.0 KB"

Goto +12

IntOp $1 $1 * 100

IntOp $1 $1 / 1024

StrCpy $2 $1 "" -1

StrCpy $3 $1 1 -2

StrCpy $1 $1 -2

IntCmp $2 5 +1 +2 +1

IntOp $3 $3 + 1

StrCmp $3 10 +1 +3

StrCpy $3 0

IntOp $1 $1 + 1

StrCpy $1 "$1.$3 MB"

/*

How can pass here and GB

*/

StrCpy $OutSize $1



Messagebox MB_OK|MB_USERICON 'Size folder: $OutSize'



SectionEnd
Аватара пользователя
MKN

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MKN »

Подскажите как изменить путь в скрипте при установке портативной и обычной версии программы .
Аватара пользователя
K.A.V.

Re: .: NSIS - все вопросы :. часть 2.

Сообщение K.A.V. »

ZaxBoys66, Спасибо огромное ! Буду пытаться прикрутить к своему скрипту.
Аватара пользователя
MKN

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MKN »

Иногда в Windows x64 необходимо определить разрядность установленного приложения (исполняемого файла).

Причём, установленного не в $PROGRAMFILES64 или $PROGRAMFILES, что могло бы служить ориентиром разрядности. А ещё имя исполняемого файла одинаково и для x32 и для x64. Как тут быть ? Изображение

Поможет функция GetBinaryType.





Код:

Код: Выделить всё

OutFile "GetBinaryType.exe"
/*
https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa364819(v=vs.85).aspx
    0: result := '32-bit Windows-based';
    1: result := 'MS-DOS – based';
    2: result := '16-bit Windows-based';
    3: result := 'PIF for MS-DOS – based';
    4: result := 'POSIX – based';
    5: result := '16bit-OS/2';
    6: result := '64-bit Windows-based';
*/
Section
  StrCpy $0 "$EXEDIR\unknown_bit.exe"
  System::Call `kernel32::GetBinaryType(t r0, *i .r2)`
  MessageBox MB_OK "$2"
SectionEnd
Аватара пользователя
kotkovets

Re: .: NSIS - все вопросы :. часть 2.

Сообщение kotkovets »

Когда то рассматривалось, как определять дефолтовое приложение (путь и имя) для открытия определённых типов файлов с помошью функции FindExecutable.



Ту же операцию можно сделать немного проще с помощью функции AssocQueryString.



Код:

Код: Выделить всё

!define ASSOCSTR_EXECUTABLE 2
!define ASSOCF_NOTRUNCATE 0x00000020
!define ASSOCF_REMAPRUNDLL 0x00000080
!define ASSOCF_NOFIXUPS 0x00000100
System::Call 'SHLWAPI::AssocQueryString(i ${ASSOCF_NOTRUNCATE}|${ASSOCF_REMAPRUNDLL}|${ASSOCF_NOFIXUPS}, i ${ASSOCSTR_EXECUTABLE}, t ".html", t "open", t.r1, *i ${NSIS_MAX_STRLEN})i.r0'
MessageBox MB_OK "EXECUTABLE  $1"

Оба эти способа нормально работают в Windows 7, но к сожалению , не в Windows 10...



Используя AssocQueryString , в Windows 10, для штатных интегрированных приложений получаем - C:\Windows\system32\LaunchWinApp.exe

Возможно это связано с особенностями работы собственных приложений в новой ОС...



Для автономно установленных приложений (например, для Хрома и т.д. ) - всё нормально.



Как крайний выход из положения, в Windows 10 можно получить только имя дефолтового приложения, если использовать константу ASSOCSTR_FRIENDLYAPPNAME





Код:

Код: Выделить всё

!define ASSOCSTR_FRIENDLYAPPNAME 4
System::Call 'SHLWAPI::AssocQueryString(i ${ASSOCF_NOTRUNCATE}|${ASSOCF_REMAPRUNDLL}|${ASSOCF_NOFIXUPS}, i ${ASSOCSTR_FRIENDLYAPPNAME}, t ".htm", t "open", t.r1, *i ${NSIS_MAX_STRLEN})i.r0'
MessageBox MB_OK "FRIENDLYAPPNAME   $1"
Аватара пользователя
MKN

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MKN »

Возвращаясь к имитации метро фейса...

При использовании WndProc.dll наблюдается такой не приятный момент. При быстром наведении курсора, то на одно изображение, то на другое - оба изображения могут выделиться (замениться на другое изображение) одновременно...

И ещё про курсор-ладошку... При перемещении курсора вне изображений , курсор очень быстро, но глазом заметно, изменяется-мельтешит, превращаясь из стрелки в ладошку и обратно...



Как бы преодолеть эти неприятные мелочи ? Код такой (дока к плагину не нашёл, может что не так и делаю... ) :



Пример кода

[spoiler]Код:
[/spoiler]

Код: Выделить всё

!include MUI2.nsh
!include LogicLib.nsh
!insertmacro MUI_LANGUAGE Russian
OutFile ClickPict_WndProc.exe
Var Dialog
Var Image
Var Image2
Page custom nsDialogsPage
Function .onInit
    InitPluginsDir
    File /ONAME=$PLUGINSDIR\Vinni.bmp Vinni.bmp
	File /ONAME=$PLUGINSDIR\Vinni2.bmp Vinni2.bmp
FunctionEnd
Function nsDialogsPage
nsDialogs::Create /NOUNLOAD 1018
Pop $Dialog
GetFunctionAddress $0 MainWndSubProc
WndProc::onCallback /r=1 $Dialog $0
${NSd_CreateBitmap} 0 0 100% 100% ''
Pop $Image
${NSD_SetImage} $Image '$PLUGINSDIR\Vinni.bmp' $1
GetFunctionAddress $0 ImgeSubProc
WndProc::onCallback /r=1 $Image $0
${NSD_AddStyle} $Image ${SS_NOTIFY} 
${NSD_OnClick} $Image Click1
${NSd_CreateBitmap} 90 0 100% 100% ''
Pop $Image2
${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni.bmp' $1
GetFunctionAddress $0 ImgeSubProc2
WndProc::onCallback /r=1 $Image2 $0
${NSD_AddStyle} $Image2 ${SS_NOTIFY} 
${NSD_OnClick} $Image2 Click2
nsDialogs::show
FunctionEnd
; Сообщение  WM_NCHITTEST отправляется в окно тогда, когда перемещается курсор, или когда кнопка мыши нажимается или отпускается. 
; Если мышь не захвачена, сообщение отправляется в окно под курсором. В противном случае, сообщение отправляется в окно, которое захватило мышь.
; Окно получает это сообщение через посредство своей функции WindowProc.
Function ImgeSubProc  ; навели курсор
System::Call USER32::LoadCursor(i,i32649)i.s
System::Call USER32::SetCursor(is)
${If} $2 = ${WM_NCHITTEST}
${NSD_SetImage} $Image '$PLUGINSDIR\Vinni2.bmp' $1
${EndIf}
FunctionEnd
Function ImgeSubProc2
System::Call USER32::LoadCursor(i,i32649)i.s
System::Call USER32::SetCursor(is)
${If} $2 = ${WM_NCHITTEST}
${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni2.bmp' $1
${EndIf}
FunctionEnd
Function MainWndSubProc  
${If} $2 = ${WM_NCHITTEST}
${NSD_SetImage} $Image '$PLUGINSDIR\Vinni.bmp' $1
${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni.bmp' $1
${EndIf}
FunctionEnd
Function Click1
MessageBox MB_OK "Click1"
FunctionEnd
Function Click2
MessageBox MB_OK "Click2"
FunctionEnd
Section
SectionEnd
Аватара пользователя
K.A.V.

Re: .: NSIS - все вопросы :. часть 2.

Сообщение K.A.V. »

Цитата lavey13:



плагин "nsArray"
.: NSIS - все вопросы :. часть 2.




так к "буржую" обращайся с поддержкой кирилицы
Аватара пользователя
Kopejkin

Re: .: NSIS - все вопросы :. часть 2.

Сообщение Kopejkin »

Цитата lavey13:



Имеется проблема решение которой затрудняюсь найти. В коде скрипта подключен плагин "nsArray"... Как только в элементе массива появляется русский текст, программа начинает крашиться
.: NSIS - все вопросы :. часть 2.




Не вижу проблем с кириллицей. Использовал NSIS v3.0b2, сценарий в кодировке UTF-8, активирован флаг компиляции Unicode.



Изображение
Аватара пользователя
K.A.V.

Re: .: NSIS - все вопросы :. часть 2.

Сообщение K.A.V. »

На Windows 10 выполняю

${WinVerGetMajor} $R0

${WinVerGetMinor} $R1

StrCpy $R0 $R0$R1

В результате в $R0 = 62, что соответствует Windows 8...

Как лучше определить, что юзаем десятку?
Ответить

Вернуться в «Автоматическая установка приложений»