NSIS warning 7998: ANSI targets are deprecated, как исправить.

Преамбула

Обновил NSIS с v 3.04 до 3.06.1, в логе компилятора стал вылезать warning:

Processed 1 file, writing output (x86-ansi):
warning 7998: ANSI targets are deprecated
...
warning:
  7998: ANSI targets are deprecated

Т.е. ANSI ему устарело. Warning не error, но все равно неприятно. Впрочем, исправить не составило особого труда.

Исправление

Для исправления этого дела, в начало скрипта надо добавить команду:

Unicode true

Только команду надо добавлять в самое начало скрипта, во всяком случае до секций и до определения параметра InstallDir. Если добавить после InstallDir:

;...
Name "${APPNAMEANDVERSION}"
InstallDir "$TEMP"
Unicode true

OutFile "TempUnicode.exe"
;...

То это вызовет ошибку:

Error: Can't change target charset after data already got compressed or header already changed!

Невозможно изменить целевую кодировку после того, как данные уже сжаты или заголовок изменен!

А лучше добавлять Unicode true вообще в самое начало скрипта, первой строчкой, даже до !include, как пишут на форуме NSIS, т.к. от чего компилятор так реагирует на смену кодировки, в документации не описано.

Примечание: с русским языком в инсталляторе проблем при смене кодировки не случилось, хотя редактор передает компилятору скрипт на STDIN, а редактор сохраняет файл скрипта в ANSI (кодировка Win 1251). Во всяком случае, проблем не случилось при использовании Venis IX.

NSIS: Отслеживание кода возврата исполняемого приложения.

Преамбула

В процессе установки иногда приходится вызывать внешние приложения, например, какую-нибудь утилиту для настройки системы, и так далее.

При вызове внешней программы надо отследить ее работу, завершена ли она корректно, или же в процессе выполнения произошла ошибка. Могу привести довольно древний пример из своего опыта, когда-то программы распространялись на CD, и производитель материнской платы давал диск с «бонусным» софтом. Но в инсталлятор была встроена программа, определявшая модель материнской платы — если модель не совпадала, установщик «халявных» программ отказывался что-либо устанавливать. Когда я распаковал установщик и проанализировал это дело, выяснилось, что установщик сначала распаковывал и запускал внешнюю утилиту, которая проверяла модель мать-доски. И возвращала код выхода: 0 — правильная мать-доска, 1 — неправильная.

Вызов внешнего приложения и получение его кода возврата из NSIS-установщика

Вызов внешнего приложения выполняется командой

ExecWait "путь_и_имя_файла параметры_программы" [переменная_для_кода_возврата]

Например:

ExecWait "$TEMP\retcode.exe 42"

Второй параметр — переменная для сохранения кода возврата вызванной программы, т.е. если мы хотим вызывать программу и анализировать ее код завершения, надо действовать так:

;...
ExecWait "$TEMP\retcode.exe 42" $0

Далее анализируем содержимое переменной $0.

Пример

Пример инсталлятора на GitHub

Источник

Reference/ExecWait

Код возврата в консольном приложении C#

Преамбула

Известно, что все приложения в Windows, после завершения передают ОС код возврата, который можно потом получить, например в BAT-файле в переменной %ERRORLEVEL% и проанализировать. Например, чтобы понять, успешно ли завершена работа программы, или же в процессе работы произошла ошибка.

А как вернуть нужный код возврата, если создаешь приложение в C#? Пока остановлюсь только на консольном приложении.

Код возврата в консольном приложении

Для возврата кода в консольном приложении достаточно изменить заголовок функции Main с
static void Main(string[] args)
на
static int Main(string[] args),
т.е. заставить главную функцию возвращать значение int (от -2147483648 до 2147483647).

Естественно, там, где функция завершается, необходимо добавить оператор
return <код_возврата>;

Пример

Программа выводит заданный в командной строке код завершения.

Исходник
EXE с тестовым BAT-файлом

Njet, Molotoff, рок-версия

Прямая ссылка https://youtu.be/48nHWWCFM6Q

Долго искал именно эту версию песни, наконец, нашел. На канале у каких-то правых голландцев, где она подписана, как финская националистическая песня. Уж не знаю, насколько она националистическая, наверное все-таки да, если рассматривать национализм с позиции «наверное бывшего» антифа, который все серьезно переосмыслил, попав в один из водоворотов событий 2014 года.

Как выяснилось, черного и белого нет. Национализм и/или патриотизм он разный бывает, бывает имперский, захватнический, за «чистую кровь» и «духовные скрепы», как у Хуйла, Гитлера, попа Смирнова или некоторых исламских муфтиев.

А бывает защитный, как у грузинов, украинцев, финнов в 1939 или даже растафари.

Второй национализм не отличим от антифашизма (в хорошем смысле этого слова). А первые (имперские) нацики в 21 веке любят называться «антифашистами».

Такие дела.

Файл фрагмента (SHS), что это, чем и как открывать.

Файл SHS — это файл Windows Shell Scrap Object, т.е. файл обмена, позволяющий обмениваться данными между программами, или временно сохранять содержимое буфера обмена на диск. Служба Windows Shell Scrap Object была удалена из Windows версий, начиная с Vista, так что открыть его в другой ОС, кроме Windows XP не получится.

Поскольку SHS — файл обмена, т.е. фактически файл-контейнер, то внутренний формат файла может быть любым, однако, некоторые способы открыть его есть.

scrap2rtf

Если в файле SHS сохранен формат текста Word или TXT, то можно применить утилиту scrap2rtf. Есть версии под Windows и Linux, как с графическим интерфейсом, так и для командной строки.

Скачать из архива Google.Code

Копии:

Версии для Windows
Версии для Linux

Восстановление работы Windows Shell Scrap Object в Windows 7

Если первый способ не помог, можно попробовать установить службу Windows Shell Scrap Object в Windows 7 из Windows XP. AfiX написал для этого утилиту.

SHSSupportW7.exe
Исходники

Простой, но долгий способ

1. Установить Windows XP на виртуальную машину.
2. Перенести на виртуальную машину файл SHS.
3. Установить нужный (или предполагаемый) софт, данные которого были в файле фрагмента.
4. Открыть фрагмент двойным кликом мыши.

ФАНФАРЫ!