![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
USB!
Le! © (2004-07-21 12:54:00)Народ как можно получить список всех устройств подключенных к USB портам???
Le! (2004-07-29 09:27:00) [1]Ручками получается хуже! хотя я уже дошел и SetupDiGetClassDevs у меня заработал! а как теперь посмотреть устройства которые он нашел (то есть как я понимаю в примерах выше вот это: DeviceInfoSet)и вывести их в какой нибудь memo или куда нить еще?? или это нереально??
DC-AC (2004-07-29 07:29:00) [2]Тебе бы ручками научиться исправлять... Учебник по сям - и вперёд..
Le! (2004-07-28 11:57:00) [3]а что не так в этом коде? нашел прогу которая переделывает из с++ в pas! начинаю исправлять ошибки и совсем закапываюсь!
procedure DeleteAllDevices(hardware_id: AnsiString);
var
DeviceInfoSet: HDEVINFO;
DeviceInfoData: SP_DEVINFO_DATA;
{$ifdef _DEBUG}
msg: AnsiString;
{$endif}
i: integer;
deviceid: pUCHAR;
begin
DeviceInfoSet:=SetupDiGetClassDevs(0{nil},0{nil},0{nil},DIGCF_PROFILE or DIGCF_ALLCLASSES);
DeviceInfoData.cbSize:= sizeof(SP_DEVINFO_DATA);
while{for}
i:=0;
{to} SetupDiEnumDeviceInfo(DeviceInfoSet,i, and DeviceInfoData)
{;}
inc(i);
do
begin
(* Цикл перечисления устройств*)
deviceid:=GetDeviceRegistryProperty(DeviceInfoSet, and DeviceInfoData,SPDRP_HARDWAREID,0{nil});
if deviceid<>0{nil} {<= !!!9}
then
begin
if 0=CompareStr(UpperCase(AnsiString({!!!a type cast? =>} {pchar(}deviceid)),UpperCase(hardware_id))
then
(* Наш Id!*)
{$ifdef _DEBUG}
begin
msg:= (AnsiString('Found device: ')+AnsiString({!!!a type cast? =>} {pchar(}deviceid));
OutputDebugString(msg.c_str());
{$endif}
if {not}0=SetupDiRemoveDevice(DeviceInfoSet, and DeviceInfoData)
then
{$ifdef _DEBUG}
begin
msg:= (AnsiString('SetupDiRemoveDevice() failed, code = ')+IntToStr(GetLastError()));
OutputDebugString(msg.c_str());
{$endif}
end;
else
{$ifdef _DEBUG}
begin
msg:= (AnsiString('Устройство удалено'));
OutputDebugString(msg.c_str());
{$endif}
end;
;
end;
;
free(deviceid);
end;
;
end;
;
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
end;
Le! (2004-07-28 11:05:00) [4]Я с API никогда не связывался! я не могу выполнить даже одну функцию! а тут сразу такой пример! спасибо! мне теперь забрираться пол года!
я спрашивал про тот код чтобы попататься выполнить хоть одну функцию а дальше я сам дойду!
у меня тот пример даже не запускается! а не то что ошибки выдает!
Они (2004-07-27 18:25:00) [5]Ну ладно. Вот примерчик. Для C++ Builder.
Следующий код перечисляет устройства и удаляет найденные в системе устройства, hardware id которых совпадает с указанным.
//---------------------------------------------------------------------------
// Удаляет все устройства с указанным id
void DeleteAllDevices(AnsiString hardware_id)
{
HDEVINFO DeviceInfoSet = SetupDiGetClassDevs(NULL,NULL,NULL,DIGCF_PROFILE|DIGCF_ALLCLASSES);
SP_DEVINFO_DATA DeviceInfoData;
#ifdef _DEBUG
AnsiString msg;
#endif
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (int i=0; SetupDiEnumDeviceInfo(DeviceInfoSet,i,&DeviceInfoData); i++)
{ // Цикл перечисления устройств
UCHAR *deviceid = GetDeviceRegistryProperty(DeviceInfoSet,&DeviceInfoData,SPDRP_HARDWAREID,NULL);
if (deviceid)
{
if (0==CompareStr(UpperCase(AnsiString((char *)deviceid)),UpperCase(hardware_id)))
{ // Наш Id!
#ifdef _DEBUG
msg = (AnsiString("Found device: ")+AnsiString((char *)deviceid));
OutputDebugString(msg.c_str());
#endif
if (!SetupDiRemoveDevice(DeviceInfoSet,&DeviceInfoData))
{
#ifdef _DEBUG
msg = (AnsiString("SetupDiRemoveDevice() failed, code = ")+IntToStr(GetLastError()));
OutputDebugString(msg.c_str());
#endif
} else
{
#ifdef _DEBUG
msg = (AnsiString("Устройство удалено"));
OutputDebugString(msg.c_str());
#endif
};
};
free(deviceid);
};
};
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
}
Для устройств USB hardware id выглядит как "USB\VID_vvvv&PID_pppp&REV_rrrr"
где vvvv - код производителя, pppp - код продукта, rrrr - код релиза.
Например: "USB\VID_0123&PID_4567&REV_0089"
Иногда rev id пропускают.
Они (2004-07-27 18:00:00) [6]>куда надо это впихнуть?
Ну, в параметр, наверно.
>вот что надо исправить в моем примере чтобы заработало!!
Всё, наверно. Это как варить суп из топора.
:)
Le! (2004-07-27 14:46:00) [7]то есть?
куда надо это впихнуть?
вот что надо исправить в моем примере чтобы заработало!!
Они (2004-07-27 14:41:00) [8]Наверно, переданы неверные параметры? Неинициализированный указатель, например.
HDEVINFO SetupDiGetClassDevs(
const GUID* ClassGuid,
PCTSTR Enumerator,
HWND hwndParent,
DWORD Flags
);
Le! (2004-07-27 09:47:00) [9]народ почему не запускается, пишет какую то хрень и я вообще так сделал? с API никогда не сталкивался!!!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SetupApi;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
hInfo: pointer;
pClassGuid: Pointer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
hInfo := SetupDiGetClassDevs(pClassGuid,NiL,0, cDIGCFPRESENT );
end;
end.
Le! (2004-07-26 15:56:00) [10]и кстати здесь:
www.delphi-jedi.org/APILIBRARY:694595
setupapi.pas!
Le! (2004-07-26 15:52:00) [11]А над ли делать для етой функции: external 'setupapi.dll' или нет?
DC-AC (2004-07-23 16:58:00) [12]>первое откуда скачать setupapi.pas
Епрст, ну писал же www.delphi-jedi.org , а если пораскинуть мозгами, то www.delphi-jedi.org/APILIBRARY:694595
Le! (2004-07-23 13:30:00) [13]вернее надо было ли писать вот так! как указано выше!
Le! (2004-07-23 13:28:00) [14]теперь след вопросы:
первое откуда скачать setupapi.pas, просто я какой то нашел у себя но не пошло выдало ошибку: Точка входа в процудуру SetupGetClassDevs не найдена в библиотеке DLL setupapi.dll!!!осюда следующий вопрос надо было писать так:
function SetupDiGetClassDevs(pClassGuid: Pointer;
Enumerator: PCHAR;
hwndParent: HWND;
Flags: DWORD):pointer;
stdcall; external 'setupapi.dll';
DC-AC (2004-07-23 07:19:00) [15]1. Скачиваем файл setupapi.pas
2. В нём видим
const
DIGCF_DEFAULT = $00000001; // only valid with DIGCF_DEVICEINTERFACE
{$EXTERNALSYM DIGCF_DEFAULT}
DIGCF_PRESENT = $00000002;
{$EXTERNALSYM DIGCF_PRESENT}
DIGCF_ALLCLASSES = $00000004;
{$EXTERNALSYM DIGCF_ALLCLASSES}
DIGCF_PROFILE = $00000008;
{$EXTERNALSYM DIGCF_PROFILE}
DIGCF_DEVICEINTERFACE = $00000010;
{$EXTERNALSYM DIGCF_DEVICEINTERFACE}
3. пишем
implementation
uses SetupApi;
4. Всё...
NorthMan (2004-07-22 16:19:00) [16]На мой взгляд можно попробовать WMI функции использовать. Они позволяют почти любую инфу получать. Теория есть на MSDN и на русском. Есть компоненты NTSet на http://www.online-admin.com, тоже могут помочь
Le! (2004-07-22 15:36:00) [17]слушайте может кто нить здесь код оставить! может я не так что делаю!
Le! (2004-07-22 12:44:00) [18]вот у него SetupDiGetClassDevs подключив библиотеку 'setupapi.dll' он его узнал а вот последнее его свойство(DIGCF_ALLCLASSES, DIGCF_DEVICEINTERFACE,
DIGCF_PRESENT, DIGCF_PROFILE) не одно не хочет воспринимать! что не так?? библиотеку пробовал подключать и статически и динамически, если это на чтото влияет!!
Le! (2004-07-22 12:34:00) [19]DIGCF_ALLCLASSES
DIGCF_DEVICEINTERFACE
DIGCF_PRESENT
DIGCF_PROFILE
почему он пишет что не знает ниодин из этих параметров????
DC-AC (2004-07-22 12:13:00) [20]www.delphi-jedi.org по-моему...