Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.06;
Скачать: CL | DM;

Вниз

поиск 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
4-16831
vitalmoya
2003-11-27 20:46
2004.02.06
список окон приложения


6-16564
Andersen
2003-12-02 14:04
2004.02.06
Что это за инфу выдает 80-ый порт?


14-16647
Rouse_
2004-01-13 19:20
2004.02.06
Из дневника американского боевого дельфина


1-16331
oleg_SYS
2004-01-24 21:27
2004.02.06
Где находятся в реестре пункты контекстных меню?


14-16681
Mr.Fox
2004-01-16 03:52
2004.02.06
Чтение форумов