Форум: "Система";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
Внизпоиск USB Найти похожие ветки
← →
div_123 (2003-11-06 19:26) [0]И снова здравствуйте недавно обращался на форум, спасибо за помощь
Но снова возник вопрос как найти DevicePath для USB устройства, в принципе вроде все делаю правильно
var
_guid: TGUID;
hdi: THANDLE;
devInfo_Data: P_SP_INFO_;
devIntr_Data: P_SP_INTERF_;
begin
...
HidD_GetHidGuid(_guid);
hdi:=SetupDiGetClassDevsA(@_guid, nil, 0, DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
if SetupDiEnumDeviceInterfaces(hdi, devInfo_Data, @_guid, 0, devIntr_Data)
then Memo1.Lines.Add("SetupDiEnumDeviceInterfaces> well")
else AddInt("SetupDiEnumDeviceInterfaces> error", GetLastError);
...
SetupDiDestroyDeviceInfoList(hdi);
end;
все отрабатывает но GetLastError выдает ошибку ERROR_NO_MORE_ITEMS (#259) те нет интерфейсов для перечисления и естественно в devInfo_Data и devIntr_Data все по нулям, а на машине стоит USB printer и устанавливались два разных USB флаш-накопителя
Причем если у принтера ГУИД не ЮСБ то у накопителей точно ЮСбишный classGUID по реестру проверял.
Кстати насчет classGuid: HidD_GetHidGuid выдает не тот что записан в реестре, но и тот что записан в реестре при подстановке в программу выдает тот же эфект т.е. ERROR_NO_MORE_ITEMS
Записаный в реестре GIUD удалось получить только черезSetupDiClassGuidsFromNameA(PChar("USB"),outName,10,num)
но тут же
SetupDiClassNameFromGuidA(outName^[i],_name,nam1,nam1)
имя класса по полученному ГУИД не выдает
вот такие пироги, маюсь уже две недели, пока нашел где функции хранятся да их параметры, а результата 0
Может кто занимался чем либо подобным и сможет подсказать что неправильно, или просто как по реестру определить DevicePath без использования этих функций, они же его оттуда берут
← →
div_123 (2003-11-11 13:22) [1]Кажется нашел причину
hdi
под DELPHI и под C++ принимает разные значения, Сишный аналог кода отрабатывает
и С и Дельфь используют для вызова функций SETUPAPI.DLL
видимо правильней SetupDiGetClassDevsA, а не SetupDiGetClassDevsW, тк последняя при аналогичных параметрах выдает ошибочный хендл (-1)
единственное - может функция некорректно объявленна
PGUID = ^TGUID;
function SetupDiGetClassDevsA(Guid: PGUID; Enumrator: PChar; Hwd: THANDLE; Flags: longint): THANDLE; stdcall; external "SETUPAPI.DLL";
может кого наведет на правильную мысль
← →
div_123 (2003-11-11 20:52) [2]вопрос снимается
разобрался еще не совсем до конца, но если что обращайтесь может смогу помочь
← →
DC-AC (2003-11-20 16:49) [3]Тоже разбирался с этим, переводил с С++. Правда у меня все работает за исключением одного момента, при отсутствии GUID в реестре не могу обработать ошибку. Об этом собственно и речь.
Не понял я одного :
hdi: THANDLE;
hdi:=SetupDiGetClassDevsA(@_guid, nil, 0, DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
Смотрим в setupapi.pas (взятый у джедаев)
HDEVINFO = Pointer;
function SetupDiGetClassDevsA(ClassGuid: PGUID; const Enumerator: PAnsiChar;
hwndParent: HWND; Flags: DWORD): HDEVINFO; stdcall;
Как это работает ?
А это
function SetupDiGetClassDevsA(Guid: PGUID; Enumrator: PChar; Hwd: THANDLE; Flags: longint): THANDLE; stdcall; external "SETUPAPI.DLL";
откуда взято ?
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.031 c