Показать полную графическую версию : Example | Скрываем чужую консоль
hasherfrog
29-06-2004, 15:40
Данная малюсенькая прога призвана решить проблему, описанную здесь (http://forum.oszone.net/topic.cgi?forum=5&topic=5133). Действительно, иногда "болтающееся" черное окно консоли раздражает. Поэтому мы напишем хитрую "обертку" для конcольных приложений, которые запускают программу, но прячут её основное консольное окно.
#include <process.h>
#include <stdio.h>
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpszCmd,int nCmd)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
/* create process with new console */
memset(&si,0,sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
if( CreateProcess( NULL, lpszCmd,
NULL, NULL, FALSE, CREATE_NEW_CONSOLE,
NULL, NULL, &si, &pi ) )
{
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
/* terminate this */
return 0;
}
Скачать (http://forum.oszone.net/post-385151-29.html)
FAQ
Q. И как использовать?
A. Компилите. Кладёте результат (например hidec.exe) в c:\windows\system32. Вместо стандартного запуска "целевого" консольного приложения идёте в Пуск->Выполнить, набираете hidec.exe путь\имя_целевого_приложения. Консольное приложение будет запущено, но его окна Вы не увидите.
Q. Эй, а где оно? И как его теперь закрыть?
A. Посмотрите через Ctrl+Alt+Del. Снимать с выполнение - там же. Если "целевое" приложение умеет само закрываться после окончания своей работы, то оно так и сделает.
Q. А может, лучше _default.pif настроить, или ярлык с определёнными свойствами сделать?
A. Я никого не заставляю делать именно по-моему.
Q. Как компилить?
A. Я использую Visual C++ Toolkit. Компиляция:
cl hide_console.cpp /GA /O1 /link /defaultlib:advapi32.lib /defaultlib:user32.lib
Q. И что, я в своих консольных приложениях такое должен делать?
A. Нет. В "своём" консольном приложении используёте FreeConsole(), или пишите через WinMain, а не main(). Данная "обёртка" нужна для чужих приложений.
Q. Можно использовать в моих программах куски текста?
A. Да, сделано специально для посетителей www.oszone.net
Q. У меня ещё вопросы...
A. Задавайте здесь, я отвечу.
Отличная утилитка, спасибо!
Реально ли сделать так, что бы скрытое окно можно было просмотреть, скажем, по нажатию сочетания клавиш?
hasherfrog
27-06-2005, 15:07
Тут возник вопрос: как бы приостановить действие батника, содержащего несколько последовательных вызовов hidec? Дело в том, что в таком случае программы вызываются практически одновременно, а иногда надо подождать сначала завершения одного процесса, а затем выполнить вызов следующего приложения.
Вот ответ:
#include <process.h>
#include <stdio.h>
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpszCmd,int nCmd)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
int bWait = 0;
if ((lpszCmd[0] == '/')&&(lpszCmd[1] == 'W')&&(lpszCmd[2] == 0x20))
{ bWait = 1; lpszCmd += 3; }
/* create process with new console */
memset(&si,0,sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
if( CreateProcess( NULL, lpszCmd,
NULL, NULL, FALSE, CREATE_NEW_CONSOLE,
NULL, NULL, &si, &pi ) )
{
if (bWait) WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
/* terminate this */
return 0;
}
Вызовы из батника выглядят так (это просто ни к чему не обязывающий пример):
hidec.exe dontwaitme_1.exe
hidec.exe dontwaitme_2.exe
hidec.exe /W 1st_app_with_wait.exe
@echo Stage 1 completed...
...
hidec.exe /W 2nd_app_(also_wait).bat
@echo Stage 2 completed...
...
Программа hidec, вызванная с параметром /W будет ждать выполнения "своего" процесса.
Надеюсь, кому-то пригодится. Готовый (скомпилёный) вариант екзешника: тут (http://hasherfrog.nm.ru/Trash/hidec.zip) (22K, сжато в зип до 11К)
hasherfrog
Спасибо! Я так понял, что /W - case sensitive?
Добавлено: хм, почему-то timestamp файла забежал в будущее... Архив с нормальным временем, а файл внутри 6/27/05 14:58. У меня сейчас 14:13 :)
hasherfrog
28-06-2005, 02:48
Vadikan
>> /W - case sensitive?
Да. Лень было писать нормальную разборку синтаксиса :-( Теоретически можно было написать ((lpszCmd[1]|0x40) == 'W') - стал бы инсенситив. Только я спешил очень. Если надо, завтра перекомпилю. Но тут вопрос такой... Понимаешь, это всё равно кривой разбор строки. Например, пара пробелов вместо одного - и ничего не запустится :-( Соответственно, в инструкции по эксплуатации я должен был бы написать: "Внимательно формируйте командную строку!!!" - и этим снять с себя обязательства за AS IS. Или написать нормальный парсер, а это не улыбается (сегодня, так-то он у меня где-то валяется; или стандартный можно подцепить, правда, за счёт увеличения размера файла).
>> хм, почему-то timestamp файла забежал в будущее...
Ты забыл, где ты, а где я? :-)
А таймстамп у архива получился нормальный, потому что он (как скачанный файл) получил время окончания скачки. Это в настройках браусвера где-то, емнип.
hasherfrog
28-06-2005, 10:10
Vadikan
:] К вопросу о размере... Savant'у есть что предложить :]
Сейчас только разберёмся с ключиками...
Код зазипован вместе с бинарником
Компиляция из ком. строки:
cl hidec.cpp /GA /O1 /link /subsystem:windows kernel32.lib advapi32.lib user32.lib
Исправленная версия (28.06.05, 14:30)
Насчет timestamp я потом уже догадался :)
Так, размер я вижу, значительно уменьшился и появилось окошко, об'ясняющее как юзать. Это хорошо. Только вот ключ стал /w. Вы либо сделайте нечувствительным к регистру, либо верните /W, а то путаница получается. Что же касается пробелов лишних, то это проблемы того, кто составляет батник. Нормальные люди ставят один пробел перед ключом, а остальным такая утилита не нужна ;)
А почему такая разница в размерах, просветите?
P.S. Я тут по ходу дела протестировал утилиту не из батника, а из RunOnceEx - все работает и ключ тоже.
VadikanА почему такая разница в размерах, просветите?
В этой теме (http://forum.oszone.net/showthread.php?t=50054) подробнее, а в принципе просто отброшена Run-Time Library + объединены секции (экономия еще ~1кб).
hasherfrog
28-06-2005, 13:51
>> А почему такая разница в размерах, просветите?
Дык это недавно обсуждалось у нас тут (http://forum.oszone.net/showthread.php?t=50054) :] Я же говорил, что у меня по аналогии "с кондачка" не получилось (с ключам компиляции/линковки запарка была), но Savant проявил мужество :] и довёл дело до конца.
***
ЗЫ. Упс, опоздал :]]]
***
Savant
>> замена memcpy - кстати, а зачем?
Как раз дабы устранить использование стандартных ненужных библиотек.
VadikanТолько вот ключ стал /w. Вы либо сделайте нечувствительным к регистру, либо верните /W, а то путаница получается.
Исправлено. Голова к вечеру начинает кое-что вспоминать ;]. Щас залью новые бинарник и исходник (через пару минут). К регистру нечувствительно.
hasherfrog
Я почему-то считал, что memset - своеобразный inline и трогать его не стал...
hasherfrog
28-06-2005, 14:39
Savant
Исправил на |0x40 на |0x20?
:] Балбесы.
>> memset - своеобразный inline и трогать его не стал...
Может и так. Но инклуд за инклудом тянет какую-то либу при линковке - я проверял.
hasherfrog & Savant
Спасибо. На MSFN утилиту же протестировали на Т-39 (за 39 минут до окончания установки виндовс, самый ранний этап на котором пользователь может запускать исполняеме файлы) - все работает.
Насчет разных редакторов я понял, а вот этого >> memset - своеобразный inline и трогать его не стал...
Может и так. Но инклуд за инклудом тянет какую-то либу при линковке - я проверял.мне не надо, спасибо :D
Vadikan
>> comments in Russian, though ;-)
LOL. Может правда перевести на англ.?
hasherfrog
29-06-2005, 01:13
>> мне не надо, спасибо :D
Ну ты это, заходи, если что... (c) Волк, "Жил-был пёс"
;-)
P.S. А тему мы завтра утречком почистим... Наверное. :-/
http://img.photobucket.com/albums/v121/Vadikan/offtopic.gif
Savant
Да ну, вряд ли там кто вникать будет в комменты. Просто изначально в этой теме было с исходным кодом, так там и сделал.
hasherfrog
Да, это вам не букмарклетам русский эквивалент придумывать, тут целиком предложения на сленге :)
Утилита подверглась усиленному тестированию на MSFN. Как выяснилось, она не работает из cmdlines.txt. Команды внесенные в файл передаются командному интерпретатору в порядке их появления в файле. Синтаксис файла такой
[Commands]
"batch1.cmd"
"batch2.cmd"
Кавычки обязательны. (подробнее (http://www.microsoft.com/resources/documentation/Windows/XP/all/reskit/en-us/prbc_cai_jteq.asp))
Не работает вариант
[Commands]
"hidec.exe batch.cmd"
Как об'яснил в PM Savant Дело в том, что там исполняемая строка полностью заключена в кавычки, а в алгоритме разбора исполняемой строки учитывается случай, когда имя файла заключается в кавычки, т.е. например "x:\path with spaces\hidec.exe" /w cmd.exe
hasherfrog, я поднял тему, т.к. не уверен что ты в курсе :) Может у тебя возникнут красивые идеи решения проблемы? Понятно, что утилита не задумывалась для работы из cmdlines.txt, но все-таки... ;-)
Меня вот какие вопросы интересуют: а предполагается ли запуск из cmdlines.txt такой конструкции "<exe-file> <parameter(s)>" и в каком виде передается исполняемая строка?
Просто из командной строки, например, выполнить такое нельзя (все, что имеется в кавычках будет посчитано за имя файла и будет выдано сообщение """winmine /?"" не является внутренней или внешней командой, исполняемой программой или пакетным файлом."). Тем не менее, почему-то прокатывает вариант "cmd /?"...
hasherfrog
10-07-2005, 21:52
"cmd /?" выполнить нельзя. Попробуйте не из командной строки, а из Пуск->Выполнить.
Vadikan, как-то не совсем понятно. Почитал-почитал доки по ссылке "почему"...
А если (без /w)
"hidec" "file1.cmd"
"hidec" "file2.cmd"
Или (с /w)
"hidec /w file1.cmd"
"hidec file2.cmd"
?
Всё дело в особенностях передачи аргументов в качестве командной строки. Я одно время очень тщательно разбирался с этим вопросом. И могу точно сказать, что в случае
т.е. например "x:\path with spaces\hidec.exe" /w cmd.exe
Будет так:
1. С использованием argv, argc:
аргумент 0: x:\path with spaces\hidec.exe - без кавычек
аргумент 1: /w
аргумент 2: cmd.exe
2. С простым разбором (как у Savant'а:
аргумент 0: x:\path with spaces\hidec.exe - не важно, но 99%, что без кавычек
аргумент 1: /w cmd.exe - без кавычек.
Нельзя писать так:
c:/> "hidec" "/w cmd"
c:/> "hidec /w cmd"
c:/> "hidec cmd"
Можно так:
c:/> "hidec" /w "cmd"
c:/> "hidec" /w cmd
c:/> hidec /w cmd
Что же касается файлов cmdlines.txt... Я не понял всё равно, почему Вы всё время пытаетесь запустить "hidec 1.cmd", а не "1.cmd", внутри которого куча hidec'ов? Есть, конечно, ещё вариант запрятать /w прямо внутрь hidec, т.е. сделать какой-нибудь wait4 (аналог hidec, но с ожиданием), если уж всё так упёрлось именно в /w. Будет две утилитки, а не одна?
hasherfrog
Vadikan, как-то не совсем понятно. Почитал-почитал доки по ссылке "почему"...
А если (без /w)Да собственно /w в данном случае не причем. В cmdlines.txt этот ключ вообще не нужен, т.к. команды и так выполняются по очереди.
Что же касается файлов cmdlines.txt... Я не понял всё равно, почему Вы всё время пытаетесь запустить "hidec 1.cmd", а не "1.cmd", внутри которого куча hidec'ов?Исключительно с эстетической точки зрения: чтобы консольные окна не мелькали. Это единственная причина. Просто маньяки автоустановки любят чтобы все было тихо-скрытно :)
Упирается-то не в ключ /w, a в то, что не срабатывает[Commands]
"hidec.exe batch.cmd"
Впрочем, это по отчетам других пользователей. Я сейчас образ сделаю и сам проверю срабатывает или нет.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC