C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
SetupDiEnumDeviceInterfaces, SetupDiEnumDeviceInterfaces
jon
Отправлено: 12.02.2007, 10:21


Ученик-кочегар

Группа: Участник
Сообщений: 20



Пишу код для доступа к драйверу USB.
Вот такая конструкция выдает список всех USB устройств:
AnsiString R;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
hDevInfo = SetupDiGetClassDevs(0, 0, 0, DIGCF_PRESENT | DIGCF_ALLCLASSES );
if (hDevInfo == INVALID_HANDLE_VALUE)
{
}
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
DeviceInterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);
for (DWORD ii=0; SetupDiEnumDeviceInfo(hDevInfo, ii, &DeviceInfoData); ii++)
{
L1->Caption=SetupDiEnumDeviceInfo(hDevInfo, ii, &DeviceInfoData);
DWORD DataT;
char* buffer = new char [100];
DWORD buffersize = 0;
while (!SetupDiGetDeviceRegistryPropertyA(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,
&DataT, (PBYTE)buffer, buffersize, &buffersize))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
if (buffer) delete[]buffer;
buffer = new char [buffersize];
}
else
{ break; }
}
R=IntToStr(ii)+" — "+buffer;
Memo1->Lines->Add®;
if (buffer) delete[]buffer;
}
if ( GetLastError()!= NO_ERROR && GetLastError()!= ERROR_NO_MORE_ITEMS )
{ }
SetupDiDestroyDeviceInfoList(hDevInfo);


А вот для доступа к драйверам устройств:


DWORD BytesReaded;
ULONG predictedLength = 0;
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData1;
HDEVINFO hDevInfo=SetupDiGetClassDevs ( 0, 0, 0, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE| DIGCF_ALLCLASSES );
DeviceInterfaceData1.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);
L1->Caption=SetupDiEnumDeviceInterfaces(hDevInfo, NULL, NULL, 0,&DeviceInterfaceData1);
ULONG requiredLength;

SetupDiGetInterfaceDeviceDetail (hDevInfo, &DeviceInterfaceData1, NULL, 0, &requiredLength, NULL);
PSP_DEVICE_INTERFACE_DETAIL_DATA DevInfoDetail =

(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredLength);

DevInfoDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

SetupDiGetInterfaceDeviceDetail (hDevInfo, &DeviceInterfaceData1, DevInfoDetail,

requiredLength, &requiredLength, NULL);
Edit5->Text=DevInfoDetail->DevicePath; //
HANDLE hUsbDevice = CreateFile ( DevInfoDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

После чего можно его запихивать в CreateFile и работать писать читать.
Но загвоздка функция SetupDiEnumDeviceInterfaces не возвращает 1 а возвращает 0. А вот SetupDiEnumDeviceInfo возвращает единицу и все получается.
Попробуйте у себя или кто знает подскажите где ошибка.
Необходимо подключить для работы с этими функциями.
#include
#include "SetupApi.h"
#include "MAPIGUID.H"
jon
Отправлено: 12.02.2007, 10:22


Ученик-кочегар

Группа: Участник
Сообщений: 20



#include
jon
Отправлено: 12.02.2007, 10:23


Ученик-кочегар

Группа: Участник
Сообщений: 20



Вот теперь видно будет
#include "initguid.h"

Вернуться в Вопросы программирования в C++Builder