Estoy tratando de detectar la inserción de dispositivos extraíbles y recuperar la letra de la unidad de dicho dispositivo con un servicio NT. He tenido éxito en detectar la inserción y eliminación de dispositivos, pero no he podido configurar una estructura DEV_BROADCAST_VOLUME
que me permita obtener la letra de la unidad, el GUID, etc. del volumen.No se pueden recuperar datos en un dispositivo extraíble utilizando un servicio de Windows en C++
case SERVICE_CONTROL_DEVICEEVENT:{
switch(evtype){
case DBT_DEVICEARRIVAL:{
DEV_BROADCAST_VOLUME *hdr = (DEV_BROADCAST_VOLUME*) evdata;
ofstream log ("C:\\log.txt", ios::app);
log << hdr->dbcv_devicetype;
log.close();
}
break;
El fragmento de código anterior compila y se ejecuta correctamente, pero cuando inserto una unidad flash, hdr->dbcv_devicetype
registros como un valor de 55555
y DBT_DEVTYP_VOLUME
(que es lo que es una unidad USB) se define como 2
(hdr->dbcv_devicetype
debe ser igual DBT_DEVTYP_VOLUME
porque inserté una unidad flash). Por algún motivo, o bien el DBT_DEVTYP_VOLUME
no se está inicializando correctamente, o bien, estoy haciendo algo más que está mal. Estoy usando Windows 7 con Visual Studio 2011 C++.
¿Ha considerado que las unidades y los conductores se encuentran? la diferencia entre un "disco duro USB externo" y un "disco duro USB interno" es arbitraria. Sin mencionar que técnicamente la definición de "disco" y "volumen" y Drive son diferentes ... Ah, y para los puntos de bonificación, lo que LOCAL_SYSTEM ve como C: \ no tiene que ser lo que el usuario ve como c: \ – Dan
Idealmente, debe hacer esto en el contexto del usuario ya que las asignaciones de letra de unidad se administran por usuario. Si eres capaz de hacer eso, entonces puedes simplificar enormemente tu tarea ya que el explorador ya hace el trabajo duro; puede usar una simple llamada a SHChangeNotifyRegister() para obtener las notificaciones. – Luke
@Luke Esa idea suena bien, pero ¿seguirá detectando unidades que no están montadas? Por ejemplo, Windows no montará un sistema de archivos Linux, solo informará al usuario para formatearlo. ¿'SHChangeNotifyRegister()' levantará la inserción aunque no esté montada en una letra de unidad como 'E: \\'? – user99545