// . . . // retorna un mensaje de la libreria dinamica "hotplug" function usbGetMessage(uID: Cardinal; lpString: PChar): string; // retorna la serie (física) de un dispositivo USB function usbGetSerial(Drive: Char; var SerialNumber: ShortString): LongBool; // intenta expulsar un dispositivo en forma segura function usbTryEject(Drive: Char): LongBool; // enumera todos los archivos/carpetas abiertos de una unidad function usbEnumUses(Drive: Char; Callback: TCallback; Param: Pointer = nil): Integer; // . . .
Un ejemplo de su modo de uso;
// . . . uses Ejector; function Enumerator(dwProcessId: Cardinal; lpObject, lpProcessName, lpList: PChar): LongBool; stdcall; begin PString(lpList)^ := PString(lpList)^ + #13' - ' + lpProcessName + '(' + IntToStr(dwProcessId) + ') - "' + lpObject + '"'; Result := True; end; procedure TForm1.Button1Click(Sender: TObject); var List: string; Count: Integer; Serial: ShortString; begin Button1.Enabled := False; // lock button... List := usbGetMessage(1206, 'H:') + #13; // get "unstopable" message Count := usbEnumUses('H', Enumerator, @List); // enumerate opened handles if (Count = -1) or not usbGetSerial('H', Serial) then // get "real" serial of device MessageBox(Handle, PChar(usbGetMessage(1003, nil)), PChar(Application.Title), MB_ICONERROR) else if Count > 0 then MessageBox(Handle, PChar(List), nil, MB_ICONEXCLAMATION) // show opened objects else if MessageBox(Handle, PChar('Estás seguro de expulsar la unidad "' + Serial + '" ?'), PChar(Application.Title), MB_ICONQUESTION or MB_YESNO) = ID_YES then if not usbTryEject('H') then // try to eject it... MessageBox(Handle, PChar(usbGetMessage(2257, 'H:')), nil, MB_ICONERROR) else MessageBox(Handle, PChar(usbGetMessage(2260, 'H:')), nil, MB_ICONINFORMATION); Button1.Enabled := True; end; // . . .
La función más inestable del código es usbEnumUses que utiliza un par de APIs no documentadas, utilizadas por el S.O. y sujetas a cambios, sin embargo dicha función habrá de cambiar según se encuentren alternativas optimas y con sus comentarios.
Enjoy!