Главная страница
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.029 c
14-16652
Igorek
2004-01-11 11:52
2004.02.06
Идея


14-16662
Кот Бегемот
2004-01-17 13:08
2004.02.06
Люди ! ! ! Давайте жить дружно


3-16111
AndrewK
2004-01-16 16:05
2004.02.06
Вопрос по SET ANSI NULLS


4-16827
Reanimator
2003-11-30 23:28
2004.02.06
Как по хендлу окна получить путь к екзешнику


3-16077
Леонид
2004-01-10 01:41
2004.02.06
Поиск одинаковых фрагментов текста в БД