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

 

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

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

Агуров П.В. Интерфейсы USB. Практика использования и программирования — СПб.: БХВ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interface2004.djvu
Предыдущая << 1 .. 141 142 143 144 145 146 < 147 > 148 149 150 151 152 153 .. 166 >> Следующая

Если поле lpoveriapped не null, то оно должно содержать указатель на
структуру OVERLAPPED. ЕсЛИ hDevice был ОТКрЫТ без ИСПОЛЬЗОВаНИЯ флага
File_flag_overlapPED, то этот параметр будет игнорироваться. Иначе операция будет расцениваться как асинхронная. Структура lpoveriapped в этом случае должна содержать правильный дескриптор объекта события, иначе функция завершится с непредсказуемой ошибкой.
Для асинхронных операций функция DeviceloControl завершается сразу же, а сигнальный объект-событие будет сигнализировать о завершении операции. В синхронном режиме функция не завершится, пока не завершится операция, или завершится по ошибке.
Важно отметить, что в Windows 95/98/МЕ эту функцию можно применять только к дескрипторам виртуальных драйверов. Например, для открытия системного VxD-драйвера надо передавать в функцию CreateFiie имя
\\.\vwin32.
16.9.1. Возвращаемое значение
При успешном выполнении функция DeviceloControl возвращает ненулевое значение. В случае ошибки вернет 0, а вызов GetLastError вернет код ошибки.
16.10. Функция QueryDosDevice: получение имени устройства по его DOS-имени
Функция QueryDosDevice возвращает информацию о DOS-имени устройства. Функция может получить текущее значение NT-имени для данного DOS-имени или вернуть список всех DOS-имен системы.
Формат заголовка на языке С имеет вид:
DWORD QueryDosDevice(
LPCTSTR pName, // DOS-имя устройства
LPTSTR pResult, // буфер для результата
488
Часть V. Справочник
DWORD dwMax, Il размер буфера pResult
) ;
Формат заголовка на языке Delphi имеет вид:
function QueryDosDevice(
lpDeviceName : PChar; II DOS-имя устройства
IpTargetPath : PChar; II буфер для результата
ucchMax : DWORD Il размер буфера pResult
): DWORD;
Первый параметр передает DOS-имя устройства, например, COMl или С:. В этом случае в буфер pResult будет записано внутреннее имя устройства. Если же pName нулевой, то в буфер будут записаны все DOS-имена, зарегистрированные в системе. Каждое имя — строка, завершающаяся нуль-символом. Признак завершения таблицы имен — двойной нуль-символ (т. е. пустая строка).
Второй параметр передает буфер для сохранения результата. Размер буфера передается в параметре dwMax. Если размер буфера мал, то результат выполнения зависит от версии операционной системы (см. далее).
16.10.1. Возвращаемое значение
При успешном выполнении функция QueryDosDevice возвращает число символов, сохраненных в буфере. В случае ошибки вернет 0, а вызов
GetLastError вернет КОД ошибки.
Если буфер имеет недостаточный размер, функция вернет 0, а вызов
GetLastError вернет КОД ERROR_INSUFFICIENT_BUFFER. В Windows NT/2000
если буфер мал, функция запишет в буфер столько данных, на сколько хватит его объема.
16.10.2. Пример вызова
Листинг 16.14 показывает получение списка всех имен в системе с помощью
ВЫЗОВа QueryDosDevice.
Листинг 16.14. Пример вызова функции QueryDosDevice
(Получение всех имен устройства}
procedure TForml.btnGetListClick(Sender: TObject);
var BufSize : Cardinal; P, PName : Pointer; SName : String;
begin
Глава 16. Базовые функции Windows
489
(Очищаем предыдущий список} lbNameList. Items. Clear;
(Размер буфера} BufSize:= 10240;
{Распределяем память для буфера} GetMem(P, BufSize); (Запрашиваем список имен}
If QueryDosDevice(nil, Р, BufSize) <> 0 then begin (Цикл по всем именам...} PName:= Р;
While (True) do begin SName:= StrPas(PName); If SName = '' then Break; (Добавляем в список} lbNameList.Items.Add(SName); (Переход к следующему устройству} (Сдвигаем указатель на следующую строку} PName:= Pointer(Longlnt(PName) + Length(SName)+1); End; End;
(Освобождаем буфер} FreeMem(P); end;
16.11. Функция DefineDosDevice: операции с DOS-именем устройства
Функция DefineDosDevice определяет, переопределяет или удаляет DOS-имя из системы. Выполняемая операция зависит от параметра dwFiags. Его возможные значения приведены в табл. 11.3.
Формат заголовка на языке С имеет вид:
BOOL DefineDosDevice(
DWORD dwFiags, Il код операции
LPCTSTR pName, // DOS-имя устройства или его префикс
LPCTSTR pDevice, // NT-имя устройства
);
490
Часть V. Справочник
Формат заголовка на языке Delphi имеет вид:
function DefineDosDevice(
dwFlags : DWORD; Il код операции
lpDeviceName, II DOS-имя устройс
// DOS-имя устройства или его префикс
IpTargetPath : PChar // NT-имя устройства ): BOOL;
Первый параметр задает код операции (табл. 16.3). Второй параметр передает DOS-имя устройства, а третий — внутреннее имя устройства. Для выполнения этой функции требуются права администратора системы.
16.11,1. Возвращаемое значение
При успешном выполнении функция Def ineDosDevice возвращает ненулевое значение. В случае ошибки функция вернет 0, а вызов GetLastError вернет код ошибки.
Листинг 16.15 показывает добавление имени в систему с помощью использования фуНКЦИИ DefineDosDevice.
{Добавить DOS-имя для NT-имени}
procedure TForml.btnAddNameClick(Sender: TObject); begin
If not DefineDosDevice(
DDD_RAW_TARGET_PATH,
PChar(DosDevi ceName. Text),
Предыдущая << 1 .. 141 142 143 144 145 146 < 147 > 148 149 150 151 152 153 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100