Пример: явное связывание функци и преобразования файлов

Пример: явное связывание функци и преобразования файлов

Программа 2.4, предназначенная для преобразования кодировки текстовых файлов из ASCII в Unicode, вызывает функцию Asc2Un (программа 2.5), выполняющую обработку файла с использованием операций файлового ввода/вывода. Программа 5.3 (Asc2UnMM) представляет альтернативную функцию, которая для выполнения той же операции использует отображение файлов. Обстоятельства, при которых функция Asc2UnMM обеспечивает выигрыш в скорости выполнения преобразования, ранее уже обсуждались; в основном они сводятся к тому, что файловой системой должна быть NTFS, а размер файла не должен быть слишком большим.

Программа 5.7 является модифицированным вариантом вызывающей программы, обеспечивающим возможность принятия решения относительно того, какой вариант реализации функции преобразования должен быть загружен, во время выполнения. Программа загружает DLL, получает адрес точки входа Asc2Un и вызывает функцию. В данном случае существует только одна точка входа, но реализовать вариант с несколькими точками входа не составляет особого труда. Основная программа является, по существу, той же, что и прежде, за исключением того, что библиотека DLL, которую необходимо использовать, указывается в виде параметра командной строки. В упражнении 5.9 вам предлагается написать вариант программы, в котором нужная DLL определяется на основе свойств системы и файла. Обратите внимание на то, каким образом осуществляется приведение типа адреса FARPROC к типу соответствующей функции с использованием необходимого в этом случае, но довольно сложного, синтаксиса С.

Программа 5.7. atouEL: преобразование файлов с использованием явного связывания

/* Глава 5. Версия atou, использующая явное связывание. */

#include "EvryThng.h"

int _tmain(int argc, LPTSTR argv[]) {

 /* Объявить переменную Asc2Un как функцию. */

 BOOL (*Asc2Un)(LPCTSTR, LPCTSTR, BOOL);

 DWORD LocFileIn, LocFileOut, LocDLL, DashI;

 HINSTANCE hDLL;

 FARPROC pA2U;

 LocFileIn = Options(argc, argv, _T("i"), &DashI, NULL);

 LocFileOut = LocFileIn + 1;

 LocDLL = LocFileOut + 1;

 /* Проверить существование файла, а также опущен ли параметр DashI. */

 /* Загрузить функцию преобразования из ASCII в Unicode. */

 hDLL = LoadLibrary(argv[LocDLL]);

 if (hDLL == NULL) ReportError(_T("He удается загрузить DLL."), 1, TRUE);

 /* Получить адрес точки входа. */

 pA2U = GetProcAddress(hDLL, "Asc2Un");

 if (pA2U == NULL) ReportError(_T("He найдена точка входа."), 2, TRUE);

 /* Привести тип указателя. Здесь можно использовать typedef. */

 Asc2Un = (BOOL(*)(LPCTSTR, LPCTSTR, BOOL))pA2U;

 /* Вызвать функцию. */

 Asc2Un(argv[LocFileIn], argv[LocFileOut], FALSE);

 FreeLibrary(hDLL);

 return 0;

} 

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

5.1.3. Учебный пример: PNG — формат графических файлов

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

5.1.3. Учебный пример: PNG — формат графических файлов PNG (Portable Network Graphics — переносимая сетевая графика) представляет собой формат для хранения растровых изображений. Он подобен GIF, и, в отличие от JPEG, в данном формате используется алгоритм сжатия без потерь. Формат PNG


15.4.2.1. Учебный пример: использование make для преобразования файла документации

Из книги Windows Script Host для Windows 2000/XP автора Попов Андрей Владимирович

15.4.2.1. Учебный пример: использование make для преобразования файла документации В make-файле программы fetchmail, например, есть три правила, которые связывают файлы FAQ, FEATURES и NOTES с исходными HTML-файлами fetchmail-FAQ.html, fetchmail-features.html и design-notes.html.HTML-файлы предназначены для просмотра на


15.4.2.1. Учебный пример: использование make для преобразования файла документации

Из книги Системное программирование в среде Windows автора Харт Джонсон М

15.4.2.1. Учебный пример: использование make для преобразования файла документации В make-файле программы fetchmail, например, есть три правила, которые связывают файлы FAQ, FEATURES и NOTES с исходными HTML-файлами fetchmail-FAQ.html, fetchmail-features.html и design-notes.html.HTML-файлы предназначены для просмотра на


Пример: СОМ-объект для архивирования файлов

Из книги Сетевые средства Linux автора Смит Родерик В.

Пример: СОМ-объект для архивирования файлов Представим себе следующую ситуацию. Имеется несколько каталогов на жестком диске, в которых хранятся рабочие файлы разных пользователей. Необходимо каждый день с помощью программы-архиватора arj.exe делать архивы этих файлов в


Явное связывание

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

Явное связывание Явное связывание, или связывание во время выполнения (run-time linking), требует, чтобы в программе содержались конкретные указания относительно того, когда именно необходимо загрузить или освободить библиотеку DLL. Далее программа получает адрес запрошенной


Пример создания PDF-файлов

Из книги автора

Пример создания PDF-файлов В качестве примера использования очереди печати можно привести задачу преобразования входных PostScript-данных в PDF-файлы. Для ее решения надо создать очередь подобную той, которая используется для обработки данных, сгенерированных с помощью


Пример 9-17. Изменение расширений в именах файлов:

Из книги автора

Пример 9-17. Изменение расширений в именах файлов: #!/bin/bash# rfe# ---# Изменение расширений в именах файлов.## rfe old_extension new_extension## Пример:# Изменить все расширения *.gif в именах файлов на *.jpg, в текущем каталоге# rfe gif jpgARGS=2E_BADARGS=65if [ $# -ne "$ARGS" ]then echo "Порядок


Пример 12-20. Пример форматирования списка файлов в каталоге

Из книги автора

Пример 12-20. Пример форматирования списка файлов в каталоге #!/bin/bash# За основу сценария взят пример "man column".(printf "PERMISSIONS LINKS OWNER GROUP SIZE DATE TIME PROG-NAME " ; ls -l | sed 1d) | column -t# Команда "sed 1d" удаляет первую строку, выводимую командой ls,#+ (для локали "С" это строка: "total N",#+ где "N" -- общее


Пример 12-30. Декодирование файлов

Из книги автора

Пример 12-30. Декодирование файлов #!/bin/bashlines=35 # 35 строк для заголовка (более чем достаточно).for File in * # Обход всех файлов в текущем каталоге...do search1=`head -$lines $File | grep begin | wc -w` search2=`tail -$lines $File | grep end | wc -w` # Закодированные файлы начинаются со слова "begin", #+ и заканчиваются словом


Пример 12-43. Генератор имен файлов

Из книги автора

Пример 12-43. Генератор имен файлов #!/bin/bash# tempfile-name.sh: Генератор имен временных файловBASE_STR=`mcookie` # 32-символьный (128 бит) magic cookie.POS=11 # Произвольная позиция в строке magic cookie.LEN=5 # $LEN последовательных символов.prefix=temp # В конце концов это временный ("temp")


Пример 28-1. Удаление cookie-файлов

Из книги автора

Пример 28-1. Удаление cookie-файлов if [ -f ~/.netscape/cookies ] # Удалить, если имеются.then rm -f ~/.netscape/cookiesfiln -s /dev/null ~/.netscape/cookies# Теперь, все cookie-файлы, вместо того, чтобы сохраняться на диске, будут "вылетать в трубу"./dev/zeroПодобно псевдоустройству /dev/null, /dev/zero так же является


Пример H-2. viewdata.sh: Результат преобразования VIEWDATA.BAT в сценарий командной оболочки

Из книги автора

Пример H-2. viewdata.sh: Результат преобразования VIEWDATA.BAT в сценарий командной оболочки #!/bin/bash# Результат преобразования пакетного файла VIEWDATA.BAT в сценарий командной оболочки.DATAFILE=/home/bozo/datafiles/book-collection.dataARGNO=1# @ECHO OFF Эта команда здесь не нужна.if [ $# -lt "$ARGNO" ] # IF !%1==! GOTO VIEWDATAthen less


20.2.5. Использование команды getopts для преобразования файлов

Из книги автора

20.2.5. Использование команды getopts для преобразования файлов А теперь воспользуемся сценарием tr_case, который преобразуем с помощью только что изученной команды getopts. Существует единственное отличие между методами getopts и shift, применяемыми для обработки опций командной строки.