Ir al contenido


Foto

Problema al conectar y desconectar memoria USB


  • Por favor identifícate para responder
33 respuestas en este tema

#21 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 19 febrero 2012 - 06:41

Gracias amigo, pero mas o menos que es lo que tendrìa que hacer con ese còdigo:



delphi
  1. ListBox1.Items.Add(GetDriveName(Letra + ':\'));



Pues este lo utilizo para que me muestre la unidad + su LABEL (con la manera que usted me sugirió)


  • 0

#22 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 19 febrero 2012 - 07:24

Funciona todo muy bien..... solo que sigue sin actualizarse el label cuando le cambio de nombre
a la unidad X:\

Esto no lo entiendo. El código, tal como está detecta la inserción y desinserción de un disco USB, además no da la letra de unidad sino el nombre que le asigna Windows además de la letra.  GetDriveName devuelve el nombre que le da Windows a una unidad mas su letra.

¿Que es que no se actualiza el label?. ¿Cuando, en que momento no se actualiza? ¿Le cambias a mano el nombre de unidad?.

Si cambias el nombre, no esperes que se actualice hasta que no provoques la llamada a CrearLista.

En definitiva no se exactamente a lo que te refieres.


Saludos.
  • 0

#23 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 21 febrero 2012 - 12:51

Buenas, me disculpo ante todo si no di màs detalles, lo que pasa es que con LABEL me refiero al nombre de etiqueta de las Unidades Removibles, como les decìa todo funciona muy bien pero la incognita que tengo es que cuando abro el programita detecta todo bien .... ahora si manualmente cambio su Etiqueta en el explorador de windows entonces el nuevo nombre no se actualiza en el programita, a menos que lo cierre y lo vuelve a abrir...

Este era mi incognita...... perdonèn si les incomodo....
  • 0

#24 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 21 febrero 2012 - 04:53

monchito_elroro no incomodas, tranquilo. El problema está en que si to te explicas de forma clara no se entiende la duda y es imposible responder adecuadamente.

Bien ahora entiendo que lo que haces es cambiar la etiqueta de volumen a tu unidad y que ese cambio no se actualiza.

Con el sistema que has elegido para detectar la inserción de unidad, el cambio en su etiqueta de volumen desde el explorador no va ha ser comunicado por el mensaje WM_DEVICECHANGE y por lo tanto no lo puedes manejar.

Con el sistema que te propuse en un principio para monitorizar el Shell, si puedes detectarlo, simplemente como un cambio de nombre de carpeta SHCNE_RENAMEFOLDER.  Ahora depende de tu necesidad de detectar el cambio de etiqueta de volumen para cambiar toda tu implementación a monitor de shell, monitorizar sólo cambios de nombre o no hacer nada mas.

Una solución de compromiso, para no cambiar todo el código es registrar sólo el mensaje SHCNE_RENAMEFOLDER, pero personalmente me parece un poco chapuza.

No he experimentado con Lazarus para monitorizar el Shell. Muy posiblemente esos mensajes no los reciba Lazarus y se tengan que trampear con un subclassing, pero como eso ya lo tienes implementado, no es difícil.


Saludos.


  • 0

#25 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 21 febrero 2012 - 08:18

Gracias amigo escafranda por la comprensiòn..... eso de detectar la modificaciòn de la etiqueta con el shellmonitor ya lo verè......

mas bien como ultima pregunta: ¿como podrìa hacer para que el resultado de su truco para saber la etiqueta se lea al revez, ejemplo:

en su ejemplo usando la "function GetDriveName" el resultado se leerìa "SISTEMA (C:)" ahora como podrìa hacer para el resultado se lea como "(C:)SISTEMA"

En su ejemplo de llamada usted puso:



delphi
  1. Label1.Caption:= GetDriveName('C:\');




he intentando poniendolo mas o menos asì:



delphi
  1. Label1.Caption:= ('C:\')+GetDriveName;



pero me sale error....


:)




  • 0

#26 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 22 febrero 2012 - 06:37



delphi
  1. function ReveseDrive(S: String): String;
  2. begin
  3.   Result:= Copy(S, pos('(', S), length(S))+ ' ' + Copy(S, 0, pos('(', S)-1);
  4. end;




Saludos.
  • 0

#27 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 22 febrero 2012 - 12:48

Gracias escafandra por la ayuda.... creo que este serà el final del post..... cualquier otra consulta les estarè comunicando....... gracias amigos... :) :)
  • 0

#28 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 22 febrero 2012 - 12:52

Gracias escafandra por la ayuda.... creo que este serà el final del post..... cualquier otra consulta les estarè comunicando....... gracias amigos... :) :)


Colocamos el tema como RESUELTO amigo ???

Saludox ! :)
  • 0

#29 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 22 febrero 2012 - 06:17

Upss..... disculpas  ....  :cheesy:
  • 0

#30 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 23 febrero 2012 - 01:19

Me gustaría añadir al tema una solución de compromiso al problema de que no se actualice la etiqueta de volumen recientemente cambiada en una unidad USB. Dado que en un principio monchito_elroro no quiere monitorizar el Shell, le propongo lo que le insinué aquí:

Si cambias el nombre, no esperes que se actualice hasta que no provoques la llamada a CrearLista.


Es decir y concretando la propuesta, en un evento como OnActivate o en OnShow, por ejemplo, puedes forzar una llamada a CrearLista. Con esto leerás tudas las unidades conectadas y se actualizarán sus nombres.


Saludos.
  • 0

#31 ISEKO

ISEKO

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 24 agosto 2012 - 01:55

Para los que preguntaban lo del USB aqui les dejo un codigo que encontre que se evitan el timer o el ciclo
una Unit para que la puedan usar y yo la he provado 100%
debajo un ejemplo



delphi
  1. / Component to detect when usb devices are connected or disconnected
  2. // using RegisterDeviceNotification
  3.  
  4. unit U_usb;
  5.  
  6. interface
  7.  
  8. uses
  9. Windows, Messages, SysUtils, Classes, Forms;
  10.  
  11. type
  12.  
  13. PDevBroadcastHdr = ^DEV_BROADCAST_HDR;
  14. DEV_BROADCAST_HDR = packed record
  15.                       dbch_size: DWORD;
  16.                       dbch_devicetype: DWORD;
  17.                       dbch_reserved: DWORD;
  18.                     end;
  19.  
  20. PDevBroadcastDeviceInterface = ^DEV_BROADCAST_DEVICEINTERFACE;
  21.  
  22. DEV_BROADCAST_DEVICEINTERFACE = record
  23.                                   dbcc_size: DWORD;
  24.                             dbcc_devicetype: DWORD;
  25.                               dbcc_reserved: DWORD;
  26.                             dbcc_classguid: TGUID;
  27.                                   dbcc_name: short;
  28.                                 end;
  29.  
  30. const
  31. GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
  32. DBT_DEVICEARRIVAL = $8000; // system detected a new device
  33. DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone
  34. DBT_DEVTYP_DEVICEINTERFACE = $00000005; // device interface class
  35.  
  36. type
  37.  
  38. TComponentUSB = class(TComponent)
  39. private
  40.   FWindowHandle: HWND;
  41.   FOnUSBArrival: TNotifyEvent;
  42.   FOnUSBRemove: TNotifyEvent;
  43.  
  44. procedure WndProc(var Msg: TMessage);
  45. function  USBRegister: Boolean;
  46.  
  47. protected
  48.  
  49. procedure WMDeviceChange(var Msg: TMessage); dynamic;
  50.  
  51. public
  52. constructor Create(AOwner: TComponent); override;
  53. destructor Destroy; override;
  54. published
  55.  
  56. property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival;
  57. property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
  58. end;
  59.  
  60. implementation
  61.  
  62. constructor TComponentUSB.Create(AOwner: TComponent);
  63. begin
  64. inherited Create(AOwner);
  65.   FWindowHandle := AllocateHWnd(WndProc);
  66.   USBRegister;
  67. end;
  68.  
  69. destructor TComponentUSB.Destroy;
  70. begin
  71.   DeallocateHWnd(FWindowHandle);
  72.   inherited Destroy;
  73. end;
  74.  
  75. procedure TComponentUSB.WndProc(var Msg: TMessage);
  76. begin
  77.   if (Msg.Msg = WM_DEVICECHANGE) then
  78.   begin
  79.     try
  80.       WMDeviceChange(Msg);
  81.     except
  82.       Application.HandleException(Self);
  83.     end;
  84.   end else
  85.     Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
  86. end;
  87.  
  88. procedure TComponentUSB.WMDeviceChange(var Msg: TMessage);
  89. var
  90.   devType: Integer;
  91.   Datos: PDevBroadcastHdr;
  92. begin
  93.   if (Msg.wParam = DBT_DEVICEARRIVAL) or (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) then
  94.     begin
  95.       Datos := PDevBroadcastHdr(Msg.lParam);
  96.       devType := Datos^.dbch_devicetype;
  97.       if devType = DBT_DEVTYP_DEVICEINTERFACE then
  98.         begin // USB Device
  99.           if Msg.wParam = DBT_DEVICEARRIVAL then
  100.             begin
  101.               if Assigned(FOnUSBArrival) then FOnUSBArrival(Self);
  102.             end else
  103.             begin
  104.               if Assigned(FOnUSBRemove) then FOnUSBRemove(Self);
  105.             end;
  106.         end;
  107.   end;
  108. end;
  109.  
  110. function TComponentUSB.USBRegister: Boolean;
  111. var
  112.   dbi: DEV_BROADCAST_DEVICEINTERFACE;
  113.   Size: Integer;
  114.   r: Pointer;
  115. begin
  116.   Result := False;
  117.   Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
  118.   ZeroMemory(@dbi, Size);
  119.   dbi.dbcc_size := Size;
  120.   dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
  121.   dbi.dbcc_reserved := 0;
  122.   dbi.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE;
  123.   dbi.dbcc_name := 0;
  124.  
  125.   r := RegisterDeviceNotification(FWindowHandle, @dbi,DEVICE_NOTIFY_WINDOW_HANDLE);
  126.   if Assigned(r) then Result := True;
  127. end;
  128.  
  129. end.
  130.  
  131.  
  132. ejemplo:
  133.  
  134.  
  135. procedure TForm1.USB_In(Sender: TObject);
  136. begin
  137.   label1.Caption:='USB Inserted';
  138. end;
  139.  
  140. procedure TForm1.USB_Out(Sender: TObject);
  141. begin
  142.   label1.Caption:='USB Removed';
  143. end;
  144.  
  145.  
  146. procedure TForm1.FormCreate(Sender: TObject);
  147. begin
  148.   usb:=TComponentUSB.Create(self);
  149.   usb.OnUSBArrival := USB_In;
  150.   usb.OnUSBRemove  := USB_Out;
  151. end;
  152.  
  153. procedure TForm1.FormDestroy(Sender: TObject);
  154. begin
  155.   USB.Free;
  156. end;



saludos ISEKO




  • 0

#32 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 24 agosto 2012 - 02:24

Muchas gracias compañero Iseko
  • 0

#33 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 24 agosto 2012 - 02:44

Para los que preguntaban lo del USB aqui les dejo un codigo que encontre que se evitan el timer o el ciclo...


En realidad no hay mucha diferencia entre el código que propones y éste. Mientras que el primero es un componente el segundo no lo es y ambos prescinden de timer. En realidad son la misma técnica de abordar el problema.


Saludos.
  • 0

#34 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 25 agosto 2012 - 06:34

Muy agradecido amigo escafranda por su interés....  :)
Voy a darme el tiempo para tratar de implementar el "ShellMonitor" que me recomienda...

De ahí les paso la voz... (y)
  • 0




IP.Board spam blocked by CleanTalk.