Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2015, 18:50   #1
MotoArhangel
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 51
Вопрос SetupApi проблема с получением информации об USB носителе

Пробую получить информацию о подключенной флешке. Но по каким то причинам не работает, возвращается пустая строка. В чем может быть беда?
Так же прилагаю проект.
Код:
unit UsbInfo;
 
interface
 
uses
  Windows,
  Classes,
  SetupAPI;
 
function AddUSBInfo(aGUID:TGUID;PropertyCode:integer):string;
 
implementation
 
function InfoUsbDevice(PropertyCode: Integer; PnPHandle: HDEVINFO;const DevData: TSPDevInfoData): String;
var
  dwPropertyRegDataType, dwRequiredSize: DWORD;
begin
  Result := '';
  dwRequiredSize := 0;
  dwPropertyRegDataType := REG_SZ;
  SetupDiGetDeviceRegistryPropertyA(PnPHandle, DevData,
    PropertyCode, dwPropertyRegDataType, nil, 0, dwRequiredSize);
  if not (dwPropertyRegDataType in [REG_SZ, REG_MULTI_SZ]) then Exit;
  if GetLastError = ERROR_INSUFFICIENT_BUFFER then
  begin
    SetLength(Result, dwRequiredSize);
    SetupDiGetDeviceRegistryPropertyA(PnPHandle, DevData,
      PropertyCode, dwPropertyRegDataType, @Result[1],
      dwRequiredSize, dwRequiredSize);
  end;
  case dwPropertyRegDataType of
    REG_SZ: Result := PChar(Result);
    REG_MULTI_SZ: Result := ExtractMultiString(Result);
  end;
end;
 
function AddUSBInfo(aGUID:TGUID;PropertyCode:integer):string;
var
  DrivePnPHandle: HDEVINFO;
  DeviceNumber:DWORD;
  DevData: TSPDevInfoData;
  DeviceInterfaceData: TSPDeviceInterfaceData;
  RES:BOOL;
begin
  DrivePnPHandle := SetupDiGetClassDevs(@aGUID, nil, 0, DIGCF_PRESENT);
  if DrivePnPHandle = INVALID_HANDLE_VALUE then  Exit;
 
  DeviceNumber := 0;
  repeat
   DeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData);
   DevData.cbSize := SizeOf(TSPDevInfoData);
   RES := SetupDiEnumDeviceInfo(DrivePnPHandle, DeviceNumber, DevData);
   if (RES) then
    begin
     result:=pansichar(InfoUsbDevice(PropertyCode,DrivePnPHandle, DevData));
     Inc(DeviceNumber);
    end;
  until not RES;
  SetupDiDestroyDeviceInfoList(DrivePnPHandle);
end;
end.
Код:
unit MainForm;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,Vcl.ExtCtrls,
  StrUtils, setupAPI, USBinfo;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    procedure UsbNotification;
    procedure OnDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
    { Private declarations }
  public
    procedure DeviceInfo;
    function ExistWordInString(aString:PWideChar;aSearchString:string;aSearchOptions: TStringSearchOptions): Boolean;
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function Tform1.ExistWordInString(aString:PWideChar;aSearchString:string;aSearchOptions: TStringSearchOptions): Boolean;
var
  Size : Integer;
begin
  Result:=false;
  Size:=StrLen(aString);
  result := SearchBuf(aString, Size, 0, 0, aSearchString, aSearchOptions)<>nil;
end;
 
procedure TForm1.DeviceInfo;
Var
  s:string;
begin
  s:='';
  s:=AddUSBInfo(GUID_DEVINTERFACE_USB_DEVICE,SPDRP_MFG);
  if s<>'' then  Memo1.Lines.Add('1 '+s);
 
  s:='';
  s:=AddUSBInfo(GUID_DEVINTERFACE_USB_DEVICE,SPDRP_DEVICEDESC);
  if s<>''then Memo1.Lines.Add('2 '+s);
 
  s:='';
  s:=AddUSBInfo(GUID_DEVINTERFACE_USB_DEVICE,SPDRP_DEVICEDESC);
  if s<>'' then Memo1.Lines.Add('3 '+s);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  UsbNotification;
end;
 
procedure TForm1.UsbNotification;
var
  NF:TDEV_BROADCAST_DEVICEINTERFACE;
  Size: Integer;
begin
  Size := SizeOf(TDEV_BROADCAST_DEVICEINTERFACE);
  ZeroMemory(@NF, Size);
  NF.dbcc_size := Size;
  //NF.dbcc_size:=sizeof(TDEV_BROADCAST_DEVICEINTERFACE);
  NF.dbcc_devicetype:=DBT_DEVTYP_DEVICEINTERFACE;
  NF.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE;
  NF.dbcc_reserved := 0;
  NF.dbcc_name := #0;
 //RegisterDeviceNotification(Handle,@NF,DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
  RegisterDeviceNotification(Handle,@NF,device_notify_window_handle);
end;
 
end.
Возможно не правильно указал гуид?
Код:
GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
Вложения
Тип файла: zip USB.zip (12.0 Кб, 20 просмотров)
MotoArhangel вне форума Ответить с цитированием
Старый 10.02.2015, 18:52   #2
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

В диспетчере посмотри GUID
WinCoder вне форума Ответить с цитированием
Старый 10.02.2015, 20:40   #3
MotoArhangel
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 51
По умолчанию

В принципе брат отсюда:
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Действительно у флешки показывает следующее:
Код:
{4d36e967-e325-11ce-bfc1-08002be10318}

Последний раз редактировалось MotoArhangel; 10.02.2015 в 21:02.
MotoArhangel вне форума Ответить с цитированием
Старый 10.02.2015, 20:48   #4
MotoArhangel
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 51
По умолчанию

Все осознал. Как то из под ubunt'ы восстанавливал раздел и из нее сделал загрузочную флешку Она и стала определяться как Хард, а я тут голову ломаю
Добавил:
Код:
GUID_DEVCLASS_DISKDRIVE: TGUID      = '{4d36e967-e325-11ce-bfc1-08002be10318}';
Подправил где необходимо, результат тот же

Последний раз редактировалось MotoArhangel; 10.02.2015 в 21:04.
MotoArhangel вне форума Ответить с цитированием
Старый 11.02.2015, 11:15   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Что вам мешает получить инфу через WMI?
Человек_Борща вне форума Ответить с цитированием
Старый 11.02.2015, 20:11   #6
MotoArhangel
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Что вам мешает получить инфу через WMI?
В принцыпе для меня более понятный вариант.
Вопрос, В Win32_DiskDrive серийник флешки правильнее вытаскивать как?
SerialNumber или PNPDeviceID?

И еще один попутный вопрос. Если использовать WbemScripting_TLB то в win xp при запуске приложение появляется ошибка.Собираю проект под win7 x64(WbemScripting_TLB взят отсюда же) + Delphi xe7. Как этого избежать?
Код:
var
  WMIServices  : ISWbemServices;
  Root: ISWbemObjectSet;
  Item: Variant;
  i,ii: Integer;
  start,stop,freq:Int64;
begin
  QueryPerformanceFrequency(freq);
  QueryPerformanceCounter(start);

  WMIServices := CoSWbemLocator.Create.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil);
  Root := WMIServices.ExecQuery('Select * From Win32_DiskDrive','WQL', 0, nil);
  for i := 0 to Root.Count - 1 do
  begin
    Item := Root.ItemIndex(i);
    for ii := VarArrayLowBound(Item.Capabilities, 1) to VarArrayHighBound(Item.Capabilities, 1) do if (Item.Capabilities[ii] = 7) then begin
      Memo1.Lines.Add('Caption      '+VarToStr(Item.Caption));
      Memo1.Lines.Add('Name         '+VarToStr(Item.Name));
    end;
  end;
  QueryPerformanceCounter(stop);
end;
Предполагаю что причина в Item := Root.ItemIndex(i); Посмотрел примеры в некоторых организовано по другому.
Вложения
Тип файла: zip WbemScripting_TLB.zip (25.3 Кб, 13 просмотров)

Последний раз редактировалось MotoArhangel; 12.02.2015 в 11:05.
MotoArhangel вне форума Ответить с цитированием
Старый 12.02.2015, 12:46   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Вопрос, В Win32_DiskDrive серийник флешки правильнее вытаскивать как?
SerialNumber или PNPDeviceID?
Зависит от производителя флешки. Кто-то пишет его в SerialNumber кто-то нет. Если там нет, то читать из PnPDeviceID
Человек_Борща вне форума Ответить с цитированием
Старый 12.02.2015, 15:34   #8
MotoArhangel
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 51
По умолчанию

Спасибо за участие. Разобрался.
Единственно смутило значение SerialNumber. Совершенно не тот, что в PnPDeviceID указывается.
Производитель сам его указывает? Флешка Китай=)

Последний раз редактировалось MotoArhangel; 12.02.2015 в 21:08.
MotoArhangel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с получением IP адреса helldog Работа с сетью в Delphi 2 27.12.2011 20:03
Проблема с получением страницы shvabrin Работа с сетью в Delphi 1 28.11.2011 22:49
Проблема с получением диапазона Simbad Microsoft Office Excel 6 26.11.2011 10:49
Проблема с получением страницы lukinjj PHP 2 18.07.2010 21:03
Проблема с получением имени zumm Общие вопросы Delphi 3 14.05.2010 13:06