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

 

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

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

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

// Сначала вызываем с нулевым размером буфера, получаем // размер необходимого буфера, потом вымываем повторно, // сформировав правильный буфер SetupDiGetDevi celnterfaceDetai1(PnPHandle,
SDevicelnterfaceData, nil, 0, BytesReturned, SDevData); If (BytesReturned <> 0) and
(GetLastError = ERROR_INSUFFICIENT_BUFFER) then begin Il Создаем буфер
FunctionClassDeviceData := AllocMem (BytesReturned); FunctionClassDeviceData.cbSize := 5; Il Получаем информацию
If SetupDiGetDevicelnterfaceDetail(PnPHandle,
SDevicelnterfaceData, FunctionClassDeviceData, BytesReturned, BytesReturned, SDevData) then begin Il Отобразить имя PnP-имя устройства
HidName:= StrPas(PChar(SFunctionClassDeviceData.DevicePath)); lbLog. Items.Add (HidName); Il Отобразить информацию об устройстве DisplayHIDInformation(HidName); End;
Гпава 8. НЮ-устройства
177
Il Освободить буфер FreeMem(FunctionClassDeviceData) ; End; End;
t
// Следующее устройство Inc(Devlndex); Until not Success; Finally
SetupDiDestroyDevicelnfoList(PnPHandle); End; end;
Il Отображение информации о HID-устройстве
procedure TForml.DisplayHIDInformation(HidName : String);
var HidHandle : THandle;
CanReadWriteAccess : Boolean;
Attributes : THIDDAttributes;
NumlnputBuffers : Integer;
¦Buffer : array [0..253] of WideChar;
Il Получение строки по дескриптору
Function GetString(StrDescriptor : Byte): WideString; var Buffer : array [0..253] of WideChar; begin Result := 'Ошибка'; if StrDescriptor <> 0 then if HidD_GetIndexedString(HidHandle,
StrDescriptor, Buffer, SizeOf(Buffer)) then Result:= Buffer; end;
begin
Il Сначала пробуем открыть устройство Il в режиме r/w
lbLog.Items.Add(' Пробуем открыть HID-устройство,..');
HidHandle:= CreateFiie(PChar(@HidName[1]), GENERICREAD or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE WRITE,
178
Часть III. Практика программирования
nil,
OPEN_EXISTING, О, О
);
// Устройство поддерживает запись?
CanReadWriteAccess:= HidHandle О INVALID_HANDLE_VALOE;
// Если не получилось, пробуем открыть //в режиме только чтения данных If not CanReadWriteAccess then begin HidHandle:= CreateFile(PChar(SHidName[1]), О,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
OPEN_EXISTING, 0, 0
);
End else begin
lbLog.Items.Add(' Устройство открыто в режиме read/write'); End;
Il Если не получилось - ошибка и выход
If HidHandle - INVALID_HANDLE_VALUE then begin
lbLog.Items.Add(' Ошибка открытия устройства');
Exit; End else begin
lbLog.Items.Add(' Устройство открыто в режиме read only!1); End;
Il Получаем атрибуты устройства
Attributes. Size := SizeOf(THIDDAttributes);
If HidD_GetAttributes(HidHandle, Attributes) then begin lbLog. Items .Add (
Formate vendorID=%d, ProductID=%d, VersionNumber=%d',[Attributes.VendorID, Attributes.ProductID, Attributes.VersionNumber]));
End else begin lbLog.Items.Add (' Ошибка HidD_GetAttributes');
End;
Гпава 8. HID-устройства
179
Il Получаем число буферов
If HidD_GetNumInputBuffers{HidHandle, NumlnputBuffers) then begin
lbLog.Iterns.Add (
Format{' Число входных буферов-%а',[NumlnputBuffers])); End else begin
lbLog.Items.Add(' Ошибка HidD_GetNumInputBuffers'); End;
Il Получаем идентификатор изготовителя FillChar{Buffer, SizeOf{Buffer), #0);
If HidD_GetManufacturerString{HidHandle, Buffer, SizeOf{Buffer)) then begin
lbLog.Items.Add{Format(' Производитель=%з',[Buffer])); End else begin
lbLog.Items.Add{' Ошибка HidD_GetManufacturerString'); End;
Il Получаем идентификатор продукта FillChar(Buffer, SizeOf(Buffer), #0);
If HidD_GetProductString{HidHandle, Buffer, SizeOf(Buffer)) then begin
lbLog.Items.Add(Format (' Продукт=%з',[Buffer])); End else begin
lbLog.Items.Add{' Ошибка HidD_GetProductString'); End;
Il Получаем серийный номер
FillChar(Buffer, SizeOf{Buffer), #0);
If HidD_GetSerialNumberString{HidHandle, Buffer, SizeOf(Buffer)) then begin
lbLog.Items.Add(Format{' Серийный номер=%з',[Buffer])); End else begin
lbLog.Items.Add(' Ошибка HidD_GetSerialNumberString *); End;
Il Освободить дескриптор устройства CloseHandle(HidHandle); end;
end.
180
Часть ПІ. Практика программирования
Вид формы и результат работы показаны на рис. 8.7.
\\?\hidftvid_l241 SpidJ 111 «6&30e75ab0&0&0000«4d1 е55Ь2-М Gf-11 cS-88cb-00l 111000030} Пробуєм открыть HID-устройство... Устройство открыто в режиме read only!
VendorlD=4673,ProductlD=43G9.VersionNumber=256
Число входных буФеров=8
і Поиск... J
Рис. 8.7. Результат программы, демонстрирующей НЮ-функции
Заметим, что имя НШ-устройства непохоже на обычное имя устройства, как, например, COMl или LPT. Это имя присваивается менеджером системы Plug and Play и выглядит, например, так:
\\?\hid#vid_1241&pid_llll#6s30e75ab0s0&0000#{4dle55b2-fl6f-llcf-88сЬ-001111000030}
Более подробно мы будем рассматривать использование HID-функций на практическом примере в главе 13.
Глава 9
Введение в WDM
Когда ваш компьютер говорит "Вставьте диск номер два", не торопитесь, сначала выньте диск номер один... даже если вы уверены, что сможете засунуть туда оба.
WDM (Windows Driver Modei, драйверная модель Windows) — новая модель архитектуры драйверов, предложенная Microsoft для Windows 2000. Конечно, эта архитектура развивалась, начиная с Windows 3.11, продолжала развиваться в Windows 98 и Windows NT, но по-настоящему полной она стала только в Windows 2000.
Предыдущая << 1 .. 56 57 58 59 60 61 < 62 > 63 64 65 66 67 68 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100