Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 61

Интерфейсы USB. Практика использования и программирования - Агуров П.В.

Агуров П.В. Интерфейсы USB. Практика использования и программирования — СПб.: БХВ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interface2004.djvu
Предыдущая << 1 .. 55 56 57 58 59 60 < 61 > 62 63 64 65 66 67 .. 166 >> Следующая

8.8. Взаимодействие с HlD-драйвером
Любые операции с устройством (не только с HID, но и с любым другим) производятся с помощью дескриптора устройства, получаемого с помощью вызова функции createF: ie. Основным параметром этой функции является имя устройства. Получение имени USB-устройства мы будем обсуждать в
Гпава 8. НЮ-устройства
173
главе 10, посвященной Plug and Play, а пока предположим, что у нас есть открытый дескриптор устройства.
Заголовки основных функций, предоставляемых HID-драйвером, приведены в листинге 8.6.
\ Листинг 8.6. Заголовки функций HID-драйвера (Delphi) // возвращает.GUID, связанный с HID
procedure HidD_GetHidGuid(var HidGuid: TGUID) stdcall; Il возвращает атрибуты HID-устройства (идентификаторы // производителя и продукта)
function HidD_GetAttributes(HidDeviceObject: THandle; var HidAttrs: THIDDAttributes): LongBool; stdcall;
// возвращает указатель на буфер, содержащий информацию 11 о возможностях устройства
function HidD_GetPreparsedData(HidDeviceObject: THandle; var PreparsedData: PHIDPPreparsedData): LongBool; stdcall;
Il возвращает структуру, описывающую возможности устройства
function HidP_GetCaps(PreparsedData: PHIDPPreparsedData; var Capabilities: THIDPCaps): NTSTATUS; stdcall;
Il читает feature-репорт из устройства
function HidD_GetFeature(HidDeviceObject: THandle; var Report; Size: Integer): LongBool; stdcall;
Il передает feature-репорт в устройство
function HidD_SetFeature(HidDeviceObject: THandle; ^yar Report; Size: Integer): LongBool; stdcall;
Обмен данными с устройством можно производить с помощью обычных Windows API функций ReadFile И WriteFile, соответственно для входных и выходных репортов и функций HID API HidD_GetFeature и HidD_SetFeature
для специальных репортов (см. разд. 13.6).
Важно
При использовании функции ReadFile пользовательская программа "проваливается" в системный HID-драйвер и будет находиться там до тех пор, пока не получит от HID-устройства запрошенное количество данных. Не помогает даже использование функции ReadFileEx. При написании программы необходимо таким образом разместить вызовы ReadFile, чтобы она не "вешала" основное приложение при ожидании данных с устройства.
HID-функции содержатся в модуле Hid:Dil. Для использования этих функций в Visual Studio нужно подключить модуль hidsdi.h. В Borland Delphi при-
174
Часть III. Практика программирования
іется либо подключать эти функции вручную (как показано в листинге 8.7), тибо использовать готовые классы, например, Hid.Pas из библиотеки JEDI (http://delphi-jedi.org).
'Листинг 8 7. Подключение HID-функций
const
HidModuleName = 'HID.dll';
procedure HidD_GetHidGuid(var HidGuid: TGUID) stdcall; {$EXTERNALSYM HidD_GetHidGuid}
function HidD_GetPreparsedData(HidDeviceObjectі THandle; var PreparsedData: PHIDPPreparsedData): LongBool; stdcall;
($EXTERNALSYM HidD_GetPreparsedData}
function HidD_FreePreparsedData(PreparsedData: PHIDPPreparsedData): LongBool; stdcall;
{$EXTERNALSYM HidD_FreePreparsedData)
procedure HidD_GetHidGuid; external HidModuleName name 'HidD_GetHidGuid';
function HidD_GetPreparsedData; external HidModuleName name •HidDJBetPreparsedData';
function HidD_FreePreparsedData; external HidModuleName name . 'HidD_FreePreparsedData1;
В качестве примера приведем небольшую программу, получающую список HID-устройств и отображающую свойства одного из них (листинг 8.8).
Листинг 8.8. Использование НЮ-функции
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons;
Гпава 8. HID-устройства
175
type
TForml = class(TForm) lbLog: TListBox; Panell: TPanel; Buttonl: TButton;
procedure ButtonlClick(Sender: TObject); private
procedure DisplayHIDInformation(HidName : String); public end;
var
Forml: TForml; implementation ($R *.dfm}
Uses SetupApi, Hid;
Il Отображение списка HID-устройств Il и их свойств
procedure TForml.ButtonlClick(Sender: TObject); var HidGuid : TGuid; PnPHandle : HDevInfo; DevData: TSPDevInfoData;
DevicelnterfaceData: TSPDevicelnterfaceData;
FunctionClassDeviceData: PSPDevicelnterfaceDetailData;
Success: LongBool;
Devlndex: DWORD;
BytesReturned: DWORD;
HidName : String; begin Il Очистить лог lbLog. Items. Clear; Il Получить GUID для класса HID HidD_GetHidGuid(HidGuid); Il Получаем дескриптор PnP для HID-класса PnPHandle := SetupDiGetClassDevs(SHidGuid, nil,
0, DIGCF_PRESENT or DIGCF DEVICEINTERFACE);
176
Часть III. Практика программирования
Il Если ошибка, то выходим
If PnPHandle = Pointer(INVALID_HANDLE_VALUE) then Exit; Try
Il Индекс текущего устройства Devlndex := 0;
Il Цикл по всем устройствам в HID-классе Repeat
DevicelnterfaceData.cbSize := SizeOf(TSPDevicelnterfaceData);
Il Получить информацию об интерфейсах устройства номер Devlndex Success := SetupDiEnumDevicelnterfaces(
PnPHandle, nil, HidGuid, Devlndex, DevicelnterfaceData); If Success then begin
DevData.cbSize : = SizeOf(DevData);
BytesReturned := 0;
Il Получаем подробности об устройстве с интерфейсам // DevicelnterfaceData
Предыдущая << 1 .. 55 56 57 58 59 60 < 61 > 62 63 64 65 66 67 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100