Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
уважаемые, подскажите как присвоить файлу атрибут "скрытый" после его создания? »
SetFileAttributes "$INSTDIR\имя_файл.exe" ARCHIVE|HIDDEN|SYSTEM|READONLY
NORMAL или FILE_ATTRIBUTE_NORMAL (или просто 0)
ARCHIVE или FILE_ATTRIBUTE_ARCHIVE
HIDDEN или FILE_ATTRIBUTE_HIDDEN
OFFLINE или FILE_ATTRIBUTE_OFFLINE
READONLY или FILE_ATTRIBUTE_READONLY
SYSTEM или FILE_ATTRIBUTE_SYSTEM
TEMPORARY или FILE_ATTRIBUTE_TEMPORARY
и ещё, что означает "w" в строке »
Открыть для записи.
Vincent7
30-11-2013, 21:36
section "f"
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\h'
FindWindow $1 "ConsoleWindowClass" "$EXEPATH"
IsWindow $1 0 -1
System::Call 'kernel32::AllocConsole(i -1)'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FileWrite $0 "TEST"
Sleep 3000
sectionend
Не работает... что не правильно?
Не работает... что не правильно? »
Начинать нужно с того, что здесь (в программировании) не получится всё делать по принципу "скопировал => вставил", вы должны понимать, что вы пишите и какой результат вам это даст...
Ещё раз повторюсь, скачайте и прочитайте наш Справочник по NSIS (http://forum.oszone.net/thread-168287.html), если реально хотите подружиться с NSIS
Сейчас вам учиться гораздо проще, много инфы, да и мы поможем если что...
А по коду.
Опять же, читайте справочник :)
Смотрите, вы указываете запуск cmd
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\h
но потом прописываете команду FindWindow на поиск окна, которого существовать не будет (не будет именно потому, что при исполнении команды выше через ExecDos в окне заголовка будет путь к cmd.exe, а не к вашему исполняемому файлу, как вы указали переменной $EXEPATH)
FindWindow $1 "ConsoleWindowClass" "$EXEPATH"
а всё потому, что окна с заголовком $EXEPATH (полный путь к вашему инсталлятору) даже теоретически не может существовать по одной простой причине - выше в коде данного окна явно нигде не заявленно, вы просто скопировали команду из моего примера, не разбираясь в синтаксисе.
Поэтому, при переходе к команде проверки существования окна:
IsWindow $1 0 -1
у вас получится бесконечный цикл, остановить который можно только либо убитием процесса, либо если появится долгожданное окно с заголовком, в котором прописан полный путь к уже запущенному вашему файлу :lamer:
Дальше продолжать не буду, ибо нет смысла - читайте справочник и изучайте команды, переменные и т.д.
---
и ещё, что означает "w" в строке »
Означает открыть файл для записи, удалив полностью его содержимое
Есть ещё флаги "r" - открытие файла для чтения и "a" - вроде как добавление данных в файл
Но лично я работал только с флагом "w", так что о том, как работать с другими флагами я не описывал в файле справки
Вот выдержка команды FileOpen из справки NSIS
Opens a file named "filename", and sets the handle output variable with the handle. The openmode should be one of "r" (read) "w" (write, all contents of file are destroyed) or "a" (append, meaning opened for both read and write, contents preserved). In all open modes, the file pointer is placed at the beginning of the file. If the file cannot be opened, the handle output is set to empty, and the error flag is set.
Vincent7
30-11-2013, 22:34
А как найти скрытое окно и отправлять туда сообщения? В справочнике примеров нет
Kopejkin
30-11-2013, 22:44
Можно ли управлять (установить постоянным) размером и положением окна выбора папки установки?
В общем, у меня отображается так:
http://savepic.su/3888975.png
а хочется, чтобы так:
http://savepic.su/3891023.png
Если знаете где обсуждалось, пожалуйста, ткните в ссылку.
В справочнике примеров нет »
Будем спорить?
Читайте описания всех команд в разделе "Перевод справки NSIS", сколько я вам уже дал примеров команды FindWindow ???
Можно ли управлять (установить постоянным) размером и положением окна выбора папки установки? »
Постоянным установить нельзя, т.к. это контролит сама ОС, данные хранит в реестре, вот здесь:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer
DWORD параметры Browse For Folder Height и Browse For Folder Width
Перед запуском инсталлера или перед показом диалога выбора каталога можно подсунуть промежуточную функцию и записывать нужные значения в реестр :)
Vincent7
30-11-2013, 23:17
Зачем мне читать описания всех команд если мне нужны только конкретные? А в описании команды findwindow нет примера поиска скрытого окна.
Зачем мне читать описания всех команд если мне нужны только конкретные? »
Потому что вы не понимаете, для чего пишите разные команды в своём коде
А в описании команды findwindow нет примера поиска скрытого окна. »
Команда FindWindow и есть команда поиска окон, я же вам не зря писал ранее:
Если вы не видите окна - это не означает, что его не существует »
Для этого и указывается класс окна и его заголовок, а то, что окно не показывается на экране это не признак того, что оно не существует, сколько вам ещё раз нужно это повторить, чтобы вы поняли?
Я вам для чего давал пример в этом сообщении (http://forum.oszone.net/post-2263844-799.html)? Для забавы ради? :read:
Мне кажется, там пример довольно яркий, когда вам показывается окно, туда помещается текст, затем окно скрывается на пару секунд и затем снова появляется, но уже с почти полностью заполненным текстом в окне
подскажите, как назначить иконку (со ссылкой на файл shell32.dll за № 16) для созданной директории?
CreateDirectory "$INSTDIR\Моя папка"
подскажите, как назначить иконку (со ссылкой на файл shell32.dll за № 16) для созданной директории? »
1. Директории обязательно нужно назначить аттрибут Системный
2. Создаёте в директории файл Desktop.ini (скрытый, системный)
3. Прописываете содержимое (читайте описание команды WriteINIStr в разделе "Перевод справки NSIS => Работа с INI файлами" в справочнике):
[.ShellClassInfo]
IconFile=%SystemRoot%\system32\shell32.dll
IconIndex=16
WriteINIStr "$INSTDIR\Моя папка\Desktop.ini" ".ShellClassInfo" "IconFile" "%SystemRoot%\system32\shell32.dll"
WriteINIStr "$INSTDIR\Моя папка\Desktop.ini" ".ShellClassInfo" "IconIndex" "16"
K.A.V., директория создаётся, но значок стандартный
CreateDirectory "$STARTMENU\Документы"
FileOpen $0 "$STARTMENU\Документы\Desktop.ini" w
FileWrite $0 "[.ShellClassInfo]$\r$\n"
FileWrite $0 "IconFile=%SystemRoot%\system32\shell32.dll$\r$\n"
FileWrite $0 "IconIndex=126$\r$\n"
FileClose $0
WriteINIStr "$STARTMENU\Документы\Desktop.ini" ".ShellClassInfo" "IconFile" "%SystemRoot%\system32\shell32.dll"
WriteINIStr "$STARTMENU\Документы\Desktop.ini" ".ShellClassInfo" "IconIndex" "126"
SetFileAttributes "$STARTMENU\Документы\Desktop.ini" HIDDEN|SYSTEM
не пойму где ошибка?
Возможно ли c помощью NSIS, организовать замену в файле, одних байт на другие ? ( Т.е. - заменить в файле по такому то адресу, имеющееся значение - на другое)
Если нет, то вопрос не совсем в тему - есть ли для этого, какой то утиль командной строки ?
не пойму где ошибка? »
В вашей невнимательности
1. Директории обязательно нужно назначить аттрибут Системный »
Добавить:
SetFileAttributes "$STARTMENU\Документы" SYSTEM
И зачем вам это??
FileOpen $0 "$STARTMENU\Документы\Desktop.ini" w
FileWrite $0 "[.ShellClassInfo]$\r$\n"
FileWrite $0 "IconFile=%SystemRoot%\system32\shell32.dll$\r$\n"
FileWrite $0 "IconIndex=126$\r$\n"
FileClose $0
Вы же прописали ниже
WriteINIStr "$STARTMENU\Документы\Desktop.ini" ".ShellClassInfo" "IconFile" "%SystemRoot%\system32\shell32.dll"
WriteINIStr "$STARTMENU\Документы\Desktop.ini" ".ShellClassInfo" "IconIndex" "126"
Читайте тоже справку, и главное тесты, очень много тестов
---
Возможно ли c помощью NSIS, организовать замену в файле, одних байт на другие ? ( Т.е. - заменить в файле по такому то адресу, имеющееся значение - на другое)
Если нет, то вопрос не совсем в тему - есть ли для этого, какой то утиль командной строки ? »
Насчет этого ничего не знаю, таким вопросом не задавался, твоя надежда на kotkovets :)
таким вопросом не задавался, твоя надежда на kotkovets »
А вопрос то интересный... К примеру, можно простой заменой одного на другое, в ярлыке установить свойство - "запускать от имени администратора". Сейчас для этого предлагается или громоздский код, или плагин. А был бы способ байтозамены, может было бы проще...
Vincent7
01-12-2013, 17:05
Уважаемый K.A.V, не получается у меня..
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
System::Call 'kernel32::AllocConsole(i -1)'
FileWrite $0 "TEST"
этот код создает второе окно а в мое не записывает
К примеру, можно простой заменой одного на другое, в ярлыке установить свойство - "запускать от имени администратора" »
Я в такие тонкости не вникал и не знаю о таких возможностях, мне NSIS нужен только для написания SFX Creator'а, я на NSIS ни одного инсталляционного пакета не собрал :biggrin: , не считая все те тесты, которые были сделаны мной в момент изучения возможностей NSIS
Команы FileReadByte и FileWriteByte не то в оригинальной справке к NSIS? Я просто инглиша не знаю, а гугл не особо помогает в техническом переводе правильно понять смысл...
Я, честно сказать, вообще не в теме, т.к. такими вопросами не занимался...HEX, байты и т.д. мне не интересны :)
не то? (http://forum.oszone.net/post-1559082.html#post1559082), там наш коллега amel27 советует DD (http://ru.wikipedia.org/wiki/Dd)
---
этот код создает второе окно а в мое не записывает
И не должен...Какой смысл вам давать готовые коды, если вы всё равно не желаете понимать ни смысла функций ни то, что и как писать? Зачем тогда вы пришли программировать без желания обучаться и узнавать что-то новое?
Если вам банально лень - то мне тоже лень сидеть и писать для вас готовые коды, в которых вы даже не желаете разбираться, ctrl+c => ctrl+v всем нравится
Чтобы вам писать в уже существующий процесс, вам нужно вызывать дополнительно AttachConsole и посылать этой функции PID процесса
Это последний готовый код для вас от меня, до тех пор, пока у вас не появится желание самому что-то делать, разбираться и пока не научитесь не писать всё подряд в свой код
Caption "PressKey.exe"
OutFile "PressKey.exe"
Function .onInit
FindWindow $0 "ConsoleWindowClass" "Администратор: $SYSDIR\cmd.exe"
; Ищем консольное окно, в котороее будем отправлять информацию
IsWindow $0 +2 0
; Если окно найдено - продолжаем, если нет - сообщение с ошибкой и закрытие приложения
MessageBox MB_OK|MB_ICONSTOP "Окно не найдено" idok exit
System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
; По найденному handle окна определяем PID процесса, к которому принадлежит окно
System::Call 'kernel32::AttachConsole(ir0)i.r0'
; В команду AttachConsole послыаем PID процесса, чтобы писать именно в нашу командную строку
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
; Получаем дескриптор ввода данных консоли
FileWrite $0 "TEST started...hide window after 3 seconds"
FileWrite $0 "$\n$\n$\n$\n================= Hello, Vincent7 !!! ================="
FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
; Записываем информацию в консоль
MessageBox MB_OK|MB_ICONINFORMATION "Готово"
exit:
quit
FunctionEnd
я лучше пойду покушаю бетку SFX Creator'а своего писать
kotkovets
01-12-2013, 21:15
Возможно ли c помощью NSIS, организовать замену в файле, одних байт на другие ? »
возвможно.. через FileWriteByte - тока нихера работать не будет..из за смещений адресов путем замены
нужно пересчитывать различные адреса, суммы, хэши - отсюда громоздкий километровый код
и это только в теории, а на практике - врядли..
--
Vincent7, хорош флудить здесь - код работает..
Vincent7
01-12-2013, 21:51
section "f"
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\h'
FindWindow $1 "$SYSDIR\cmd.exe"
IsWindow $1 +2 0
MessageBox MB_OK|MB_ICONSTOP "not found" idok
System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
System::Call 'kernel32::AttachConsole(ir0)i.r0'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FileWrite $1 "TEST"
sectionend
'not found'. не находит...
kotkovets
01-12-2013, 22:18
Vincent7, а с чего работать будет, с какого перепуга?
ExecDos отработает и усё - нет никакого окна после плага, видимого и невидимого :read:
нужно, запускать не в режиме ожидания выполнения процесса..
Section
Exec 'cmd.exe /c "путь к файлу exe"'
sleep 500 ;пауза, чтобы окно "споймать"
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
IsWindow $0 0 exit
System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
System::Call 'kernel32::AttachConsole(ir0)i.r0'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FileWrite $0 "TEST"
exit:
SectionEnd
---
Вообще для чего это нужно, озвучьте?
Вообще для чего это нужно, озвучьте? »
Думаю, не стоит спрашивать, ибо тут сразу было видно - человек ни в какую не хочет разбираться в этом всём, человек не понимает для чего и что он пишет, взять хотябы:
FindWindow $1 "$SYSDIR\cmd.exe" »
Он упёрто отказывается читать в файле справки, в котором ясно написано - второй параметр в команде FindWindow - это класс окна, а он там указывает имя окна
System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
System::Call 'kernel32::AttachConsole(ir0)i.r0'
System::Call 'kernel32::GetStdHandle(i -11)i.r0' »
Не будет работать по одной простой причине (не понимаете, что для чего, нужно было в FindWindow изменить переменную на $0), вы опять невнимательно пользуетесь функцией "Копировать => Вставить", я бы вырезал данную возможность из ОС у таких "программистов", я даже боюсь за пользователей, которые получат ваш горе инсталлятор, в котором случайно можно перепутать переменные и под админом натворить чудес
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FileWrite $1 "TEST" »
Опять же, несоответствие
Разве в моём примере было так? :(
---
ExecDos отработает и усё - нет никакого окна после плага, видимого и невидимого
нужно, запускать не в режиме ожидания выполнения процесса.. »
Не, там фишка с ключем /NOUNLOAD /ASYNC, если их указать, то плаг запустить процесс параллельно установщику ;)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC