Как я уже упоминал в первой статье, наша чудо-программа Port.exe не сможет работать под Windows NT. ОС данного семейства помимо кучи преимуществ перед предыдущими стали обладать омерзительным нравом с точки зрения системного программирования.
Да вы и сами могли в этом убедиться, пытаясь все таки запустить Port.exe в XP, который у вас наверняка и стоит. При этом вы получали следующее услужливое сообщение от Windows:
Происходит это из-за того что, разработчики NT с целью обеспечения безопасности использования совместных аппаратных ресурсов компьютера, запретили к ним прямой доступ из программ пользовательского режима (по сути дела из любых программ). Чтобы все-таки обратиться к порту, необходимо все операции проводить через драйвер (довольно хитрая программа, которую начинающему так сходу и не напишешь). Но к счастью, есть уже несколько готовых инструментов позволяющих без проблем общаться LPT портом в NT.
|
Начнем с начала с самого простого, и в тоже время очень мощного средства: библиотеки inpout32.dll.
|
Этот комплекс состоит из 3 файлов:
- собственно самой динамической библиотеки inpout32.dll
- статической библиотеки LIB, необходимой на этапе сборки программы
- заголовочного файла с прототипами используемых функций
Скачать эти файлы можно (и нужно) по ссылке ниже:
|
Файлы к статье скачать
|
Имя: inpout.zip (ZIP архив) |
Размер: 13 КБ |
|
Библиотека эта импортного производства, подробнее о том кто ее писал и как она работает можно почитать вот по этому адресу: http://www.logix4u.net/inpout32.htm
|
Рассмотрим практический пример использования библиотеки inpout32.dll. Интегрирурем ее в консольное приложение (С++, Microsoft Visual Studio 6.0) для возможности управления LPT портом из под ОС семейства NT.
|
Как уже упомянуто выше, программу пишем на Си++. Подробный процесс создания проекта уже был рассмотрен в предыдущей статье, поэтому сейчас буду рассказывать короче.
File -> New. Выбираем там Win32 Console Application. Указываем в поле Project name имя проекта, например Port32. Нажимаем Ok. В следюущем окне выбираем пункт An empery project и жмем Finish.
Теперь опять File -> New. Отображается закладка Files. Выбираем там C++ Source File. В поле File name укажите имя Port32 для этого файла. Нажимайте Ok. Все, подготовительную работу выполнили, можно собственно писать программу. В левой части окна программы выбираем закладку FileView. В папке Source Files выбираем наш файл Port32.cpp
От автора
|
Рекомендуется не делать так, как показано на рисунке выше, а именно размещать файлы проекта в директории, путь к которой содержит кириллические символы. Visual Studio "переваривает" такую ситуацию нормально, но иногда попадаются программные продукты для которых кирилица в пути к файлу - непреодолимое препятствие.
|
А вот собственно и исходный код нашей программы. Копируем его и вставляем в содержмое файла Port32.cpp.
#include "iostream.h"
#include "conio.h"
#include "stdlib.h"
#include "h.h"
void main()
{
int Address = 888;
cout<<"Test LPT port in Windows NT."<<endl;
cout<<"Press '1' to activate and '0' to disactivate lightdiod."<<endl;
cout<<"To exit press 'e'."<<endl;
cout<<" "<<endl;
while( 1 )
{
switch( getch() )
{
case '0': cout<<"Disactivate...."<<endl;
Out32(Address, 0);
break;
case '1': cout<<"Activate...."<<endl;
Out32(Address, 1);
break;
case 'e': exit(1);
}
}
getch();
}
От автора
|
С удивлением смотрю сейчас по прешествии уже почти 5 лет на использование операторов cout и endl. Сейчас уже рука такое напись просто не поднимется.
|
Теперь необходимо подключить к нашему проекту файлы из комплекса inpout32. Сначала необходимо скачать архив с файлами библиотеки (см. ссылку выше). Потом копируем файлы h.h, inpout32.lib в папку нашего проекта. Далее выбираем Project -> Add to Project -> Files... В открывшемся окне отыскиваем папку проекта, выбираем там только что помещенный туда файл h.h и нажимаем Ок. Файл добавится в проект. Проделываем такую же операцию и для файла inpout32.lib.
После проведения этих операций, древо проекта должно иметь примерно такой вид, как на рисунке ниже.
Далее выбираем в меню программы Build ->Compile Port32.cpp, потом Build ->Build Port32.exe Если вы все правильно скопировали, то в самом низу должн появится отладочный вывод, сообщающий нам об успешном завершении процесса компиляции программы:
--------------------Configuration: Port32 - Win32 Debug--------------------
Linking...
Port32.exe - 0 error(s), 0 warning(s)
Теперь важный момент - программу пока не запускайте. "Забираемся" в папку нашего рабочего проекта. Там должна появиться папка Debug. В эту папку необходимо поместить файл inpout32.dll. Этот файл (DLL) должен быть всегда рядом (в одной директории) с нашей программой, иначе Port32.exe не сможет работать.
От автора
|
Так же следует указать что динамическую библиотеку можно поместить в любую директорию на вам компьютере, главное чтобы путь к этой директории был прописан в системной перменной PATH, которую мы имеем возможность свободно редактировать.
|
Вот теперь запускаем нашу программу Port32.exe и проводим ее тестирование с тем же оборудованием (светодиод в порту), которое использовалось в предыдущей статье. Если ошибок не было и все файлы находятся там где надо, мы с радостью наблюдаем, как светодиод синхронно моргает с нажатием клавиш 1 и 0. Как видно из кода, серьезных изменений программа не претерпела, просто все вызовы по выводу в порт проходят через функцию Out32().
В следующих статьях будет рассмотрен еще боллее мощный инструмент для "борьбы" с Windows NT - драйвер GiveIO.sys а также займемся модернизацией нашего аппаратного оборудования, а то один светодиод - это не серьезно.
|