2015-02-26 3 views
0

Я написал установщик для Windows, используя NSIS. Если программа запускается с консоли, я хочу записать некоторую информацию на эту консоль.NSIS - печать на приглашение во время удаления командной строки

Мой код выглядит так, как в этом вопросе ...

NSIS - printing to prompt during command line install

System::Call 'kernel32::GetStdHandle(i -11)i.r0' 
System::Call 'kernel32::AttachConsole(i -1)i.r1' 
FileWrite $0 "hello" 

Там нет никаких проблем с установщиком. Но если я запускаю деинсталлятор, то нет выхода и $ 1 == 0.

Есть ли разница между установщиком и деинсталлятором для этого случая?

ответ

1

Деинсталлятор выполнит копию самой копии% Temp%, если вы не запустите ее с помощью специального параметра _?=$Instdir. (Делает это так Delete "$Instdir\uninstall.exe")

Это означает, что AttachConsole(ATTACH_PARENT_PROCESS) во втором экземпляре uninstaller попытается подключиться к родительскому процессу, у которого нет консоли. У родителя нет консоли, потому что UNIX-деинсталлятор является графическим приложением, и они не получают консоль автоматически, а обработка _?= происходит до .onInit, поэтому взломать для присоединения к одному никогда не произойдет.

Я не думаю, что есть способ обойти это без использования _?=. Использование AttachConsole - это взлом и никогда не будет отлично работать в приложении GUI ...