Главная страница
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.034 c
1-16456
Галинка
2004-01-28 06:43
2004.02.06
О типах данных в Delphi


1-16284
tytus
2004-01-26 09:18
2004.02.06
Разные битмап-ы в ListBox-e.


3-16092
Veetyok
2004-01-11 00:54
2004.02.06
Delphi виснет


14-16738
Akvilon
2004-01-12 22:19
2004.02.06
На чем написана Delphi?


3-16070
velial
2004-01-12 09:57
2004.02.06
Многострочный возврат из StoredProc