|
Программирование >> Перегруженные имена функций и идентификаторы
else if( stricmp( attr, data )==0 ) { FILE *tfp; sprintf( datafile, %s D , Tmpname ); getmultiline( data , lineval, fp, MAXBIGBUF, Bigbuf ); tfp = fopen( datafile, w ); if( tfp == NULL ) return( Eerr( 294, Cannot open tmp data file , datafile )); fprintf( tfp, %s , Bigbuf ); fclose( tfp ); Это как раз и есть выделение секции с данными и запись ее во временный файл. Вообще, использование fprintf с шаблоном %s уже смотрится очень оригинально, но то, что идет 80 строками ниже еще более необычно: if( standardinput strcmp( datafile, - ) ==0 ) { /* a file of - means read from stdin */ dfp = stdin; goto PT1; if( strlen( datafile ) > 0 ) sprintf( command, cat %s , datafile ); if( strlen( command ) > 0 ) { dfp = popen( command, r ); if( dfp == NULL ) { Skipout = 1; return( Eerr( 401, Cannot open , command ) ); PT1: Обратите внимание на строчку: if( strlen( datafile ) > 0 ) sprintf( command, cat %s , datafile ); и следующую за ней: dfp = popen( command, r ); Честно говоря, это впечатляет. Очень впечатляет... при этом, совершено не понятно что мешало использовать обычный fopen() для этого (раз уж так хочется), раз уж есть строки вида: dfp = stdin; goto PT1; В общем, дикость. Если кто-то не понял, то объясним то, что происходит, на пальцах: читается секция data и ее содержимое записывается в файл, название которого содержится в datafile. Потом, проверяется название этого файла, если оно равно - , то это значит, что данные ожидаются со стандартного файла ввода, stdin. Если же нет, то проверяется длина строки, на которую указывает datafile. Если она ненулевая, то считается, что команда, результаты работы которой будут считаться за входные данные, это cat datafile . Если же ненулевая длина у другого параметра, command, то его значение принимается за выполняемую команду. После всех этих манипуляций, открывается программный канал (pipe) при помощи popen(), результатом которой является обычный указатель на структуру FILE (при его помощи можно использовать обычные средства ввода-вывода). Вам это не смешно? Автоматизация и моторизация приложения Программирование давно стало сплавом творчества и строительства, оставляя в прошлом сугубо научно-шаманскую окраску ремесла. И если такой переход уже сделан, то сейчас можно обозначить новый виток - ломание барьеров API и переход к более обобщенному подходу в проектировании, выход на новый уровень абстракции. Немало этому способствовал Интернет и его грандиозное творение - XML. Сегодня ключ к успеху приложения сплавляется из способности его создателей обеспечить максимальную совместимость со стандартами и в то же время масштабируемость. Придумано такое количество различных технологий для связи приложений и повторного использования кода, что сегодня прикладные программы не могут жить без такой поддержки . Под термином автоматизация понимается настоящее оживление приложений, придание им способности взаимодействовать с внешней средой, предоставление пользователю максимального эффекта в работе с приложениями. Не равняясь на такие гранды технической документации, как MSDN, тем не менее, хотим указать на путь, по которому сегодня проектируются современные приложения. Автоматизация как есть Автоматизация (Automation) б1ла изначально создана как способ дя приложений (таких как Word или Excel) предоставлять свою функциональность другим приложениям, включая скрипт-языки. Основная идея заключалась в том, чтобы обеспечить наиболее удобный режим доступа к внутренним объектам, свойствам и методам приложения, не нуждаясь при этом в многочисленных хедерах и библиотеках. Вообще, можно выделить два вида автоматизации -внешнюю и внутреннюю. Внешняя автоматизация - это работа сторонних приложений с объектной моделью вашей программы, а внутренняя - это когда сама программа предоставляет пользователю возможность работы со своей объектной структурой через скрипты. Комбинирование первого и второго вида представляется наиболее масштабируемым решением и именно о нем пойдет речь. Для начала обратим внимание на самое дно - интерфейсы COM. Если термин интерфейс в этом контексте вам ничего не говорит, то представьте себе абстрактный класс без реализации - это и есть интерфейс. Реальные объекты наследуются от интерфейсов. Компоненты, наследующиеся от интерфейса lUnknown, называются COM-объектами. Этот интерфейс содержит методы подсчета ссылок и получения других интерфейсов объекта. Автоматизация базируется на интерфейсе IDispatch, наследующегося от lUnknown. IDispatch позволяет запускать методы и обращаться к свойствам вашего объекта через их символьные имена. Интерфейс имеет немного методов, которые являются тем не менее довольно сложными в реализации. К счастью, существует множество шаблонных классов,
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.149
При копировании материалов приветствуются ссылки. |