Old-DOS.ru

X -- Win32 ShellExecute from DOS prompt

Системные программы >> Утилиты >> Системные
Главная страница Файлы Игры Поиск Форум Wiki Библиотека Галерея Гостевая Ссылки О проекте

Логин:
Пароль:


Регистрация
Восстановление пароля




+ ОПЕРАЦИОННЫЕ СИСТЕМЫ
   + DOS
      • IBM PC DOS
      + MS-DOS
         • SDK
      • DR-DOS
      • FreeDOS
      • Сборки на базе DOS
      • Расширители DOS
      • Другие платформы
   + OS/2
      • SDK
   + Windows
      + Windows 1.x-3.x
         • Патчи и дополнения к Win1.x-3.x
      + Windows 9x
         • Патчи и дополнения к Win9x
      + Windows NT
         • Патчи и дополнения к WinNT+
      • Сборки на базе Windows
      • SDK
   • Linux/Unix
   • СР/М
   • Другие операционные системы
   • Загрузочные диски
   • Готовые образы операционных систем
   • Многозадачные оболочки
   + Системные программы
      • Твикеры
      • Русификаторы
      + Утилиты
         • Оборудование
         • Работа с CD/DVD
         • Инсталляторы
         • Автоматизация, скрипты, BAT-файлы
         • Системные
         + Инструменты
            • Turbo Pascal Pentium II DIV BUG fixing
         • Прочее
      • Замедлители
      • Тесты оборудования и системы
      • Обновления
   + Драйверы
      • Звук
      • Видео
      • Мыши
      • CD/DVD
      • Клавиатура
      • Принтеры
      • USB
      • Сеть
      • Память
      • Материнские платы
      • Периферия
      • Другое
   • OS BuildList
+ ЭМУЛЯТОРЫ И СИМУЛЯТОРЫ
   • Эмуляторы калькуляторов
   • Консоли
   • Эмуляторы компьютеров
   • Инструменты для эмуляторов
+ ПРОГРАММИРОВАНИЕ
   + Assembler
      • Disassembler
   • Pascal/Delphi
   • C/C++
   • Basic/Visual Basic
   • Фортран
   • SDK & DDK, etc.
   • Декомпиляторы
   • Форт
   • Генераторы блок-схем
   • Лисп
   • Пролог
   • Java
   + Отладчики программ (DEBUGGERs)
      • Трассировщики
   • Другие языки программирования
   • Справочники и учебники
+ BIOS, прошивки
   • Прошивки
   • Редакторы BIOS
   • Прошивальщики
+ ДИСКИ И ФАЙЛЫ
   • Файловые менеджеры
   • Каталогизаторы
   • Копировщики
   • Поиск файлов, текста, байтов
   • Сканирование каталогов
   • Архиваторы
   • EXE-упаковщики
   • EXE-распаковщики
   • Восстановление информации и резервное копирование (бэкап)
   • HDD-утилиты
   • Дискеты
   • Разное
• СУБД
+ ОФИС
   • Интегрированные программные пакеты
   • Издательские системы
   • Электронные таблицы
   • Редакторы текста
   • Редакторы HTML
   + Утилиты для работы с текстом
      • OCR - распознавание текста
      • Просмотр документов
      • Печать
      • Перекодировка
      • Сравнение текстов
      • Шрифты
      • Работа со шрифтами
   • Словари и переводчики
   • Правописание
   • Органайзеры
   • Создание презентаций
   • Бизнес
   • Разное
+ ОБРАЗОВАНИЕ И НАУКА
   + Информатика
      • Программирование
   + Инженерное ПО
      + Расчётные задачи
         • Пар и вода
      + ЧПУ
         • ЧПУ Редакторы
         • DNC
      + САПР
         + Механика - моделирование 2D/3D
            • AutoCAD и утилиты для AutoCAD'а
         • Строительство
         • Электроника, радио- и электротехника
   • Тестирование знаний и навыков
   + Обучающие программы
      • Музыка
   + Математика
      • Калькуляторы
      • Эмуляторы калькуляторов
   • Физика
   • Химия
   + Электроника и электротехника
      • ПЛИС, PAL
      • Справочники по электронике
      • Расчётные утилиты
      • Программаторы
      • Микроконтроллеры
   • Астрономия
   • Астрология
   • География и картография
   + Биология и медицина
      • Психология
   • История и политология
   • Лингвистика
   • Гаданье на кофейной гуще
   • Справочники разные
+ БЕЗОПАСНОСТЬ
   • Антивирусы
   • Шифры и пароли
+ ИНТЕРНЕТ И СЕТИ
   • Эмуляторы терминала
   • Браузеры
   • Почтовые клиенты
   • IM-меседжеры
   • Звонилки
   • Кодеры/декодеры UUE
   • Пейджеры
   • FTP
   • BBS и FIDO
   • Работа с СОM/LPT
   • LAN
   • Удалённое управление
   • Факсы
   • Работа с мобильными телефонами
   • Разное
+ МУЛЬТИМЕДИА
   + Графика
      • Просмотр графики
      • Редакторы графики
      • Грабберы графики
      • Конвертеры
   + Звук и видео
      • Проигрыватели (плееры) аудио и видео
      • Редакторы аудио и видео
      • Грабберы (захват) аудио и видео
      • Синтез речи
      • Конвертеры
      • Кодеки
   • Разное
+ РАБОЧИЙ СТОЛ
   • Календари
   • Часы
   • Напоминалки
   • Скринсейверы
   • DEMO
   • Программы-шутки
   • Разное
+ АНДЕРГРАУНД
   + Hack tools
      • Крякеры
      • CRK-утилиты
      • Генераторы лоадеров (Loader generators)
      • Патчи, коды
      • Детекторы
   • Стеганография
   • Шестнадцатеричные редакторы
   • Вирусы
• РАЗНОЕ
• ФЕЙКИ, ПОДДЕЛКИ, ХИМЕРЫ
• --НА УДАЛЕНИЕ
• КАК ЗАГРУЖАТЬ ФАЙЛЫ НА Old-DOS




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.
ФайлРазмерВыпускВерсияЯзыкКачествоЗагрузил
Ссылка x
ArcСкачать478
6.1 Кб20140.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)
Да нормально.
Спасибо.

Имя:
E-mail:
 =
Ваш комментарий:
Как размножаются компьютерщики? Просто: I/O, I/O...

For abuses about copyright: srzone@mail.ru
Для жалоб на авторские права: srzone@mail.ru
Float 1.0.3 Copyright © 2008-2023 StrannikRiddler. All rights reserved.
18+. Находясь на этом сайте, вы соглашаетесь с его правилами
13 queries, db time 0.005545, memory 1492.5 Kb, total time 0.088 sec