|
X -- Win32 ShellExecute from DOS prompt | Описание | Информация | X -- Win32 ShellExecute from DOS prompt
Безобразная примочка. Делалось для себя. Пригодится для тех, кто посиживает под WinNT+ в сеансе DOS.
Итак,
если у нас файл, который хотим запустить, имеет длинное имя, тогда просто тыцнув по нему курсором в Volkov Commander'e его запустить не удастся. MS-DOS v.5 (в WinXP от неё command.com) скажет, что файл не найден и до свидания.
Тут два пути.
1) Первый. Включить в Volkov Commander'e отображение коротких имён файлов вместо длинных. Это по <Ctrl+N>. Получим для файла, например, "Это моё первая праграма.EXE", - короткое имя, например это будет "эт____~1.EXE" и по этому файлу тыцнем курсром. Он запустится. Но некоторые программы (блин) при запуске проверяют собственое имя файла и если оно изменено (например, на осмысленное короткое), то тогда уже эта программа сама говорит досвидания. Такая программа откажется работать и в случае, когда вместо оригинального длинного имени файла вы попытаетесь запустить её по соответствующему короткому имени, как из VolkovCommander'a по <Ctrl+N>. То есть, такой вариант запуска не годится.
2) Тогда второй путь. Фирменный, микрософтовский способ - в командной строке в том же VC пишем:
CMD /C "Это моё первая праграма.EXE"
- в Volkov Commander'e имя в кавычках вставится в команду по <Ctrl+Enter>. Всё рабтает нормально, потому что CMD.EXE выполнил для этого затейливого файла функцию ShellExecute. Всё прекрасно, программа работает. Но сеанс DOS, откуда она запустилась, не работает. Ждёт окончания рабты этой самой запущенной WIN32 программы. Эта же ситуация и при запуске WIN32 программы по её короткому имени. Приходится открывать новый сеанс DOS, чтобы дальше работать, а тот висит. Это нас устраивать тоже не может и не должно. Кстати, в Win9x это было не так. Дочерний процесс работал отдельно и не держал выполнение процесса родителя.
3) Третий путь тоже есть. Можно запускать файлы со стрёмными именами (да и вообще с любыми) с помощью утилиты X.EXE (by.SVD.) Это 32-битный PE-EXE файл, который запускает программу, переданную ему аргументом, а сам завершается, давая возможность работать в DOS-сеансе дальше.
Даём команду:
X "Это моё первая праграма.EXE"
- и получаем желаемый результат. "Праграма" запустилась в своём окне, наш сеанс DOS, в котором мы её запустили, продолжает работать. Потому, что программа X.EXE, запустив желанную "Праграму", благополучно завершилась и не держит дальше окно нашего сеанса DOS. Удобно настроить VolkovCommander на запуск EXE-файлов через X.EXE (По <Alt+F4> - Это настраивается в vcedit.ext файле).
В общем, описывать это всё довольно муторно. Надо просто пробовать. Или не пробовать, если непонятно, зачем нужна эта примочка. .
| Раздел: Системные
x (случайный скриншот) Скриншоты Операционная система: Windows NT Требования: - Автор: .SVD. Издатель: -
Добавил: Nika (2014.11.16) | Доступные файлы - сортировка по имени и версии, времени добавления Файлов: 1. Файл | Размер | Выпуск | Версия | Язык | Качество | Загрузил | | 6.1 Кб | 2014 | 0.000a | Английский | | Nika 2014.11.16 | 219 |
|
Комментарии | #1 Автор: SergeCpp (2014.11.17 01:05, изменений: 1, 2014.11.17 01:29) | !!! :)
В "моём" Multi-Edit в файловом менеджере (Shift+F3) на файле (или на каталоге) нажимаете Shift+Enter (а можете и Alt+Enter попробовать /только в ярлыке это сочетание отключить, чтобы Windows не перехватывала/ и Alt+F). Это почти (*) недокументировано и (вроде бы) только в Win 9x.
(*) Упоминается в этом сообщении ("Каталог UTIL"): http://forum.old-dos.ru/viewtopic.php?p=1432#p1432
Программки: RUN.EXE, PROP.EXE, FIND.EXE в каталоге UTIL.
Исходные тексты: ME_UTIL_SOURCES (вроде бы).
P.S. Кто не в курсе, это про: http://old-dos.ru/index.php?page=files&mode=files&do=show&id=1328
|
#2 Автор: Nika (2014.11.17 05:06, изменений: 16, 2014.11.17 16:12) | SergeCpp, да, я видел те мелкие утилиты в каталоге UTIL. Все они направлены на управление элементами эксплорера, тут и есть их слабое место. Получились сильно платформозависимыми. У меня под WinXP они работают только частично.То-есть запускаться-то запускаются и вызывают желаемую функцию эксплорера, но потом при завершении нужной функции, например, окошка запуска файлов, - остаются висеть в памяти, и при этом ещё и держат в мёртвом состоянии тот сеанс DOS, из которого они были запущены. К тому же программка run.exe не передаёт в окошко запуска аргумент - имя запускаемой программы. В общем, для WinXP их нужно ещё адаптировать.
Да, они висят в памяти и держат в мёртвом состоянии сеанс DOS, из которого были запущены. Так происходит до тех пор, пока с помощью менеджера процессов <Ctrl+Alt+Del> они не выгружаются принудительно.
Так вот, представленная на этой странице программка X.EXE позволяет избежать зависания сеанса DOS при запуске этих программ. Нужно запускать их так:
X run [progname] X find <DIRNAME> X prop <FileDirName>
Хотя в памяти они всё равно остаются и приходится жать <Ctrl+Alt+Del>. Этой прблемы не было в Win9x, а в WinXP я намучился с запуском Win32 программ в DOS-сеансе. Сейчас вот прямо отдыхаю - получилось то, что надо. Прямо как в Win9x. Ну только буковку приходится лишнюю добавлять ("Х") в командной строке, а в остальном всё Ок.
Давно собирался забацать такую примочку, а сегодня, когда у меня набралось с десяток подвешенных впустую DOS-окон, обозлился и запилил наконец избавленье от этого головняка. Пол-часа делов. (Какие же всё-таки микрософтовцы негодяи, нет слов..).
В MS-DOS v.7x DOS хорошо взаимодействует с ядром Windows путём выдачи прерывания int20h (VxDCall). В WinNT категорически нет такого механизма, применяется тупо эмуляция DOS-окружения (ну,может, и не совсем тупо, но не настолько круто, как в MS-DOS7.x), отсюда и все проблемы.
P.S. Вообще для меня загадка, неужели мне одному мешают эти чудачества с запуском приложений в DOS-сеансе.. Просто нигде не встречал даже постановку такой проблемы. Видимо, COMMAND.COM и VC.COM уже никто не использует, вот так и получается. Уже даже в FAR'е этой проблемы нет, потому что он 32-битный. P.P.S. ..в разы больше времени заняло описание прожки на этой странице, чем собственно написание её самоё.. |
#3 Автор: SergeCpp (2014.11.17 19:04) | Да, в памяти NT+ процесс остаётся, это в NT4 было отмечено (я там и писал их) -- уж MSDN читал-читал, так и не вышло (сделал там какие-то дополнения, чтоб в NT выходил из памяти /помогало! хотя и не всегда, кажется/, видно, в XP и они не помогают). Нужно бы было поразбираться, но, так как 1) неприоритетно, 2) NT -- не целевая система для ME, то углублённо разбираться не стал.
(Как-то захотел, чтоб сразу DOS-сеанс выходил, без остановки и без выдачи сообщения при нажатии кнопки, дизассемблировал какой-то файл /не помню уже, какой/ и сделал. Наглядно (Win9x) -- создайте пустой T.BAT и запустите из Explorer. T.BAT так и останется на экране, реагируя на нажатие (только первое!) клавиатуры сообщением, нажмите, мол, Close button.)
Про DOS-процесс не помню (курсор в NT не всегда ещё отключается при разных операциях /где я его отключаю/). В WinMe -- абсолютно замечательно работает и отключение курсора и всё остальное.
А MSDN полезно читать "для общего развития", вот это я так и вычитал: http://old-dos.ru/index.php?page=lib&do=show&id=16 и применил, в частности, работу с кнопкой закрытия DOS-окна -- не закроется, если что-то делает редактор, и запишет всё, если закрыть, когда можно, см.: http://forum.old-dos.ru/viewtopic.php?p=1460#p1460
|
#4 Автор: SergeCpp (2014.11.17 19:26) | X run [progname] => Можно и каталог и всё, что угодно.
Оказывается, я забыл. ShiftEnter запускает не через RUN.EXE, а через c:\windows\command\start.exe. Это DIRSHELL.S строка 1505 >> WIN3UTIL.S строка 393. Ага, путь попросту define (в STDPATH.SH), никаких поисков (и просмотров environment) не выполняется. А RUN.EXE вообще в \src\ отсутствует (и зачем я её в util поместил?..).
|
#5 Автор: Nika (2014.11.17 19:28, изменений: 12, 2014.11.17 19:52) | Чисто теоретически.. Насчёт завершения программок - а не пробовали ли перехватить таймер (вернее, создать таймер. В windows так просто ничего не перехватывается), чтобы после выполнения ShellExecute снова получить управление и запросить ExitProcess?
Просто (насколько я понял) программки ждут завершения Explorer.exe, а этого можно ждать очень долго и так и не дождаться.
Программка X.EXE делает проще - запускается функция CreateProcess. То есть, она по сути своей есть лоадер.
----------------------------------------------------- >> Можно и каталог и всё, что угодно.
-- Ясно, раз для той строки выполняется ShellExecute().
------------------------------------------------------ >> Оказывается, я забыл. [...]
-- У меня в вашем ME не срабатывают вообще никакие горячие клавиши, касающиеся запусков этих программок. Очень всё сложно.. |
#6 Автор: SergeCpp (2014.11.17 23:15, изменений: 2, 2014.11.17 23:20) | Там что-то иное, не помню уже. Сейчас скачаю (на другом разделе исходники), посмотрю... (Но в любом случае, я это делал более десяти лет назад...)
Вот (PROP.CPP), там даже цикл не помог (в XP), как видим (в NT4, вроде бы, помогал):
// prop / find // -----------
/* PSTR pCmd( GetCommandLine() ); UINT Max( lstrlen( pCmd ) );
if( PSTR pFile( NextParam( pCmd, Max ) ) ) { SHELLEXECUTEINFO sei;
for( int i = 0; i < sizeof( SHELLEXECUTEINFO ); i++ ) { ((char*)( &sei ))[ i ] = 0; }
sei.cbSize = sizeof sei; sei.fMask = SEE_MASK_INVOKEIDLIST; sei.lpVerb = "properties"; // "find" sei.lpFile = pFile;
ShellExecuteEx( &sei ); Sleep ( 1500 );
loop: HWND h( NULL );
do { h = FindWindowEx( NULL, h, "#32770", NULL );
DWORD id;
GetWindowThreadProcessId( h, &id );
if( id == GetCurrentProcessId() ) { Sleep( 100 ); goto loop; } } while( h );
Sleep ( 1500 ); // just in case (some COM stuff there) ExitProcess( 0 ); // COM stuff's threads are need to be kicked off }
Это именно PROP.EXE. В RUN (ниже там) без цикла (значит, тогда проблем не было).
// run // ---
/* POINT pt;
GetCursorPos( &pt );
HWND hw( CreateWindow( "STATIC", NULL, 0, pt.x - 40, // to be on caption pt.y - 30, // for help drag 1, 1, NULL, NULL, NULL, NULL ) );
g_hProc = (WNDPROC)SetWindowLong( hw, GWL_WNDPROC, (long)Sub );
// typedef void (__stdcall *P)( HWND, HICON, // void*, // ? // PCWSTR, // caption, PCSTR under 9x // PCWSTR, // prompt, PCSTR under 9x // int // displayed LRU // ); // // P pf( (P)GetProcAddress( LoadLibrary( "SHELL32.DLL" ), (PCSTR)61 ) ); // // pf ( hw, NULL, NULL, NULL, NULL, 0 ); ShellRunDialog( hw, NULL, NULL, NULL, NULL, 0 );
DestroyWindow ( hw ); // to remove focus (helps if <Esc> was pressed) Sleep ( 700 ); // give time to activate window if some run from dialog ExitProcess ( 0 ); // COM stuff's threads are need to be kicked off
*/
Цитаты огромны, ну да пусть уж будут.
P.S. Форматирование поехало, смотрите по кнопке "Редактировать комментарий", там форматирование есть (хотя и табуляция стала 8 вместо 4).
|
#7 Автор: Nika (2014.11.17 23:43) | Да нормально. Спасибо. |
| |
|