Программизм |
|
|
|
Batch-файлы в Windows NTПользователи всех клонов *nix давно уже могут писать командные файлы на любом языке. Для этого надо лишь указать в первой строке имя интерпретатора. Так, например, если бы хотим, чтобы скрипт исполнялся при помощи Korn shell, надо начать его строчкой
#!/bin/ksh
А чем хуже пользователи Windows NT? Мне, например, очень удобно писать свои скрипты на REXX или gawk. Можно было бы добавить соответствующее расширение к переменной среды В unixовом синтаксисе имеется символ Самый простой способ сделать это — воспользоваться функцией BOOL CreateProcess( // pointer to name of executable module LPCTSTR lpApplicationName, // pointer to command line string LPTSTR lpCommandLine, // process security attributes LPSECURITY_ATTRIBUTES lpProcessAttributes, // thread security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes, // handle inheritance flag BOOL bInheritHandles, // creation flags DWORD dwCreationFlags, // pointer to new environment block LPVOID lpEnvironment, // pointer to current directory name LPCTSTR lpCurrentDirectory, // pointer to STARTUPINFO LPSTARTUPINFO lpStartupInfo, // pointer to PROCESS_INFORMATION LPPROCESS_INFORMATION lpProcessInformation ); Несмотря на кажущуюся сложность, функция чрезвычайно проста, если нужно сделать простую вещь, и в то же время достаточно гибкая, чтобы делать сложные вещи. Нам понадобятся всего лишь три параметра:
После того, как новый процесс запущен, необходимо дождаться его завершения, чтобы batch-файл мог дождаться окончания работы интерпретатора, а не запускающей программы. Вот, собственно, и весь текст программы: #include <windows.h> int main(void) { char *p = GetCommandLine(), brkchar; PROCESS_INFORMATION _processinfo; STARTUPINFO _startupinfo = { sizeof(_startupinfo), NULL, NULL, NULL, 0,0, 0,0, 0,0, 0, 0, 0, 0, NULL, 0, 0, 0 }; brkchar = (*p=='"') ? ++p,'"' : ' '; while(*p && *p!=brkchar) p++; if ((*p)=='"') p++; if (*p) p++; else return 1; if (CreateProcess( NULL,p,NULL,NULL,TRUE,0,NULL,NULL, &_startupinfo,&_processinfo) ) { WaitForSingleObject(_processinfo.hProcess, INFINITE); CloseHandle(_processinfo.hProcess); CloseHandle(_processinfo.hThread); } return 0; }
Как теперь этим пользоваться? А почти так же, как и в *nixе. Скомпилировать или скачать исполняемый модуль, переименовать его в #.exe и положить туда, куда протоптан # gawk -f "%~f0" %* & exit BEGIN { print "Hello, world!"; }
Очевидно, в Windows 95/98 работать это не будет, так как там нет ни
И ещё один нюанс. Параметры командной строки передаются в программу на C/C++ в виде параметров функции Размер получившегося исполняемого модуля — 12 K, меньше просто не бывает. Скачать программу можно в соответствующем разделе.
И, наконец, ложка дёгтя в цистерне мёда. При запуске скрипта первой строкой вывода будет первая строка файла, т.к. 8.01.2003 P.S. Оказывается, 12 K — далеко не предел миниатюризации, что не может не радовать. Стоит добавить в исходный текст программы магические комментарии, как программа помещается в 1 (один!) килобайт. Вся магия подробно описана в статье «Дзэн — Си — Win32», а у меня уже лежит обновлённая версия. |
ПоискСм. такжеКомандный язык Windows NT — всё ещё корявый и хитрый, но уже достаточно мощный инструмент, которым можно и нужно пользоваться... »»» я попытаюсь по возможности просто рассказать о семействе алгоритмов Брезенхема, а также приведу готовый к использованию код на JavaScript... »»» Для начала следует понять, какие вопросы нас интересуют: pазумеется, хиты и хосты, количество визитов по ссылкам, количество визитов с поисковых серверов — это, фактически, случайные посетители... »»» Рекомендую
e.g.Orius Copyright noticeъ) Все материалы, размещённые на странице, являются неотъемлемой собственностью автора с вытекающими отсюда правами, как ©, так и (ъ). Некоммерческое их распространение всячески приветствуется, разумеется, при условии сохранения ссылки на оригинал. Что касается коммерческого использования — пишите письма, договориться можно всегда. Удивительное рядом
Пишите письма
Счётчики |