popoff Опубликовано 11 января, 2008 Жалоба Поделиться Опубликовано 11 января, 2008 пишу прогу на C++ Builder. нужно вызвать вешний exe'шник с параметрами, чтобы произвести распаковку ресурсов.нужно чтобы моя программа ждала пока выполняются действия по распаковке, поэтому использую функцию spawnlp с параметром P_WAIT. но вылазящее окно консоли портит вид программы. как его скрыть?p.s.: ShellExecute, WinExec и прочее не подходит, так как нужно, чтобы программа ждала пока выполняются действия в консоли. Ссылка на комментарий
genemy Опубликовано 12 января, 2008 Жалоба Поделиться Опубликовано 12 января, 2008 т.е. ты запускаешь внешний архиватор ?а что мешает отследить его завершение ?т.е. создаешь процесс и ловишь потом его завершение Ссылка на комментарий
0xDEADBEEF Опубликовано 12 января, 2008 Жалоба Поделиться Опубликовано 12 января, 2008 мм Думается лучше использовать Win32 API. CreateProcess - создаст процесс, потом WaiForSingleObject - будет ждать завершения. А по поводу консоли надо посмотреть в сторону ConsoleAttach/ConsoleDetach, либо найти дескриптор окна консоли и его скрыть, а ещё можно попробовать перенаправить стандартный вывод при создании в CreateProcess.Вообщем API вещ мощная и многогранная, но в вашем случае удобнее будет использовать библиотеки для архивации (вроде zlib, или boost::iostream ), благо их пруд-пруди. Ссылка на комментарий
popoff Опубликовано 12 января, 2008 Автор Жалоба Поделиться Опубликовано 12 января, 2008 т.е. ты запускаешь внешний архиватор ?к сожалению это не архивирование. еслиб можно было не пользоваться внешними распаковщиками, то сделал бы все внутри проги. это распаковщик ресурсов игры.а что мешает отследить его завершение ?т.е. создаешь процесс и ловишь потом его завершениемешает то, что CreateProcess + WaiForSingleObject делают все как надо, но окно консоли все равно вылазит.ConsoleAttach/ConsoleDetach, либо найти дескриптор окна консоли и его скрытьнепонял где это если использую CreateProcess, в справке не нашел.а ещё можно попробовать перенаправить стандартный вывод при создании в CreateProcess.а как?Добавлено спустя 16 минут 58 секунд:все. разобрался вроде. 0xDEADBEEF, спасибо.сделал так: STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; //вот оно! si.wShowWindow = SW_HIDE; //вот оно! CreateProcess ( NULL, "some_command_line", NULL, NULL, FALSE, 0, NULL, NULL, &si, π ); WaitForSingleObject( pi.hProcess, INFINITE ); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); Ссылка на комментарий
0xDEADBEEF Опубликовано 12 января, 2008 Жалоба Поделиться Опубликовано 12 января, 2008 к сожалению это не архивирование...это распаковщик ресурсов игрыИМХО, врятли кто-то будет придумывать свой формат ресурсов, скорей всего там тупо архивы. Сжатие в любом случае идет по стандартному алгоритму, нужно только узнать по какому, допустим по заголовку.Непонял где это если использую CreateProcessЕсли вы пользуетесть встроенной спарвкой, то там этого и очень многого другого нет, лучше взять MSDN там исчерпывающая информация.На API не писал года 2, а с подобной проблемой сталкивался лишь единожды.1. В API есть функции работы с консолью (ConsoleXXX), настройки и т.п. ConsoleDetach помоему действовать может только от лица текущего процесса.2. Это впринципе стандартый прием и наверно самый действенный, ишем дескриптор окна процесса, и скрываем это окно. Для всего есть API функции, какие не скажу - гугл вам в помощь.3. По умолчанию CreateProcess наследует дескрипторы родителя, в том числе и стандартный ввод/вывод. А ещё можно с флагами поигратся.Жаль нет под рукой винды со справкой, так бы сказал точно.Еще полезно было бы почитать Рихтера, он до костей разбирает API ядра.P.S. Сорри, не заметил Ссылка на комментарий
popoff Опубликовано 12 января, 2008 Автор Жалоба Поделиться Опубликовано 12 января, 2008 ИМХО, врятли кто-то будет придумывать свой формат ресурсов, скорей всего там тупо архивы. Сжатие в любом случае идет по стандартному алгоритму, нужно только узнать по какому, допустим по заголовку.игра 1993 года выпуска. и я достоверно точно знаю что там не тупо архивы. в нете можно нарыть формат этих ресурсов, но разбираться с этим нудно, а главное ненужно.да и решилась же уже проблема. Ссылка на комментарий
popoff Опубликовано 12 января, 2008 Автор Жалоба Поделиться Опубликовано 12 января, 2008 смотрите что мне на стбур'овском форуме посоветовали))function GetConsoleHwnd():HWND;const BufSize=1024;var FoundHwnd: HWND; NewWindowTitle, OldWindowTitle: PChar;begin OldWindowTitle:=''; GetConsoleTitle(OldWindowTitle, BufSize); NewWindowTitle:=PChar(IntToStr(GetTickCount())+IntToStr(GetCurrentProcessId())); SetConsoleTitle(NewWindowTitle); Sleep(40); FoundHwnd:=FindWindow(nil, NewWindowTitle); SetConsoleTitle(OldWindowTitle); Result:=FoundHwnd;end;procedure Main();var WindowHwnd: HWND;begin WindowHwnd:=GetConsoleHwnd; ShowWindow(WindowHwnd, SW_HIDE); SomeLoop();end; Ссылка на комментарий
0xDEADBEEF Опубликовано 12 января, 2008 Жалоба Поделиться Опубликовано 12 января, 2008 Этот код скрывает консоль текущего процесса.Либо я нуб, лино нахрена менять заголовок, чтобы получить дескриптор окна? Поясните пожалуйста ктонибудь в чем здесь скрытый смысл? А зачем sleep, и откуда это магическое число 40 и 1024?C CreateProcess вариант лучше, к томуже он решает поставленную задачу. Ссылка на комментарий
popoff Опубликовано 12 января, 2008 Автор Жалоба Поделиться Опубликовано 12 января, 2008 Этот код скрывает консоль текущего процесса.Либо я нуб, лино нахрена менять заголовок, чтобы получить дескриптор окна? Поясните пожалуйста ктонибудь в чем здесь скрытый смысл? А зачем sleep, и откуда это магическое число 40 и 1024?C CreateProcess вариант лучше, к томуже он решает поставленную задачу.это вот тут http://forum.stbur.ru/index.php?showtopic=17907&st=0&gopid=286444entry286444 если интересно, то спроси назанечение магических чисел у самого хатабыча) Ссылка на комментарий
Рекомендуемые сообщения
Пожалуйста, войдите, чтобы комментировать
Вы сможете оставить комментарий после входа в
Войти