Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 972

/ вопрос открыт /

Добрый вечер, уважаемые эксперты! Возник вопрос, возможно ли средствами Delphi остановить flash накопитель? Т.е. безопасно извлечь его ...

WHILL Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: WHILL (статус: Посетитель)
Вопрос отправлен: 6 октября 2008, 21:02
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, WHILL!
Вот несколько ссылок по работе с USB на Delphi, надеюсь вам они помогут:
1. http://articles.org.ru/cfaq/index.php?qid=1123&frommostrecent=yes
2. http://articles.org.ru/cfaq/index.php?qid=250&catid=48
3. http://www.delphimaster.ru/cgi-bin/forum.pl?id=1160629902&n=10
4. DevEject
А так же смотрите пример в приложении.

P.S. Желаю удачи.

Приложение:
  1. program USBEject;
  2.  
  3. uses
  4. Windows;
  5.  
  6. const
  7. setupapi = 'SetupApi.dll';
  8.  
  9. type
  10. HDEVINFO = THandle;
  11.  
  12. PSP_DEVINFO_DATA = ^SP_DEVINFO_DATA;
  13. SP_DEVINFO_DATA = packed record
  14. cbSize: DWORD;
  15. ClassGuid: TGUID;
  16. DevInst: DWORD;
  17. Reserved: DWORD;
  18. end;
  19.  
  20. function SetupDiGetClassDevsA(ClassGuid: PGUID; Enumerator: PChar; hwndParent: HWND; Flags: DWORD): HDEVINFO; stdcall; external setupapi;
  21. function SetupDiEnumDeviceInfo(DeviceInfoSet: HDEVINFO; MemberIndex: DWORD; DeviceInfoData: PSP_DEVINFO_DATA): boolean; stdcall; external setupapi;
  22. function SetupDiDestroyDeviceInfoList(DeviceInfoSet: HDEVINFO): boolean; stdcall; external setupapi;
  23. function CM_Get_Parent(pdnDevInst: PDWORD; dnDevInst: DWORD; ulFlags: DWORD): DWORD; stdcall; external setupapi;
  24. function CM_Get_Device_ID_Size(pulLen: PDWORD; dnDevInst: DWORD; ulFlags: DWORD): DWORD; stdcall; external setupapi;
  25. function CM_Get_Device_IDA(dnDevInst: DWORD; Buffer: PChar; BufferLen: DWORD; ulFlags: DWORD): DWORD; stdcall; external setupapi;
  26. function CM_Locate_DevNodeA(pdnDevInst: PDWORD; pDeviceID: PChar; ulFlags: DWORD): DWORD; stdcall; external setupapi;
  27. function CM_Request_Device_EjectA(dnDevInst: DWORD; pVetoType: Pointer; pszVetoName: PChar; ulNameLength: DWORD;
  28. ulFlags: DWORD): DWORD; stdcall; external setupapi;
  29.  
  30. function IsUSBDevice(DevInst: DWORD): boolean;
  31. function CompareMem(p1, p2: Pointer; len: DWORD): boolean;
  32. var
  33. i: DWORD;
  34. begin
  35. result := false;
  36. if len = 0 then exit;
  37. for i := 0 to len-1 do
  38. if PByte(DWORD(p1) + i)^ <> PByte(DWORD(p2) + i)^ then exit;
  39. result := true;
  40. end;
  41. var
  42. IDLen: DWORD;
  43. ID: PChar;
  44. begin
  45. result := false;
  46. if (CM_Get_Device_ID_Size(@IDLen, DevInst, 0) <> 0) or (IDLen = 0) then exit;
  47. inc(IDLen);
  48. ID := GetMemory(IDLen);
  49. if ID = nil then exit;
  50. if (CM_Get_Device_IDA(DevInst, ID, IDLen, 0) <> 0) or (not CompareMem(ID, PChar('USBSTOR'), 7)) then
  51. begin
  52. FreeMemory(ID);
  53. exit;
  54. end;
  55. FreeMemory(ID);
  56. result := true;
  57. end;
  58.  
  59. procedure EjectUSB();
  60. const
  61. GUID_DEVCLASS_DISKDRIVE: TGUID = (D1: $4D36E967; D2: $E325; D3: $11CE; D4: ($BF, $C1, $08, $00, $2B, $E1, $03, $18));
  62. var
  63. hDevInfoSet: HDEVINFO;
  64. DevInfo: SP_DEVINFO_DATA;
  65. i: Integer;
  66. Parent: DWORD;
  67. VetoName: PChar;
  68. begin
  69. DevInfo.cbSize := sizeof(SP_DEVINFO_DATA);
  70. hDevInfoSet := SetupDiGetClassDevsA(@GUID_DEVCLASS_DISKDRIVE, nil, 0, 2);
  71. if hDevInfoSet = INVALID_HANDLE_VALUE then exit;
  72. i := 0;
  73. while (SetupDiEnumDeviceInfo(hDevInfoSet, i, @DevInfo)) do
  74. begin
  75. if (IsUSBDevice(DevInfo.DevInst)) and (CM_Get_Parent(@Parent, DevInfo.DevInst, 0) = 0) then
  76. begin
  77. VetoName := GetMemory(260);
  78. if (CM_Request_Device_EjectA(Parent, nil, VetoName, 260, 0) <> 0) then
  79. begin
  80. if (CM_Locate_DevNodeA(@Parent, VetoName, 0) <> 0) then
  81. begin
  82. FreeMemory(VetoName);
  83. continue;
  84. end;
  85. FreeMemory(VetoName);
  86. if (CM_Request_Device_EjectA(Parent, nil, nil, 0, 0) <> 0) then continue;
  87. end;
  88. FreeMemory(VetoName);
  89. break;
  90. end;
  91. inc(i);
  92. end;
  93. SetupDiDestroyDeviceInfoList(hDevInfoSet);
  94. end;
  95.  
  96. begin
  97.  
  98. EjectUSB();
  99. end.


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 7 октября 2008, 10:03
Оценка за ответ: 5

Комментарий к оценке: Спасибо!

Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:28
Выполнено за 0.03 сек.