U盘拔出,获取拔出的U盘的盘符..

fangchao918628 2010-05-11 04:50:53
不需要通过前后比较....
当接收到拔出的消息后,怎么样获取拔出的U盘的盘符
...全文
505 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangchao918628 2010-05-11
  • 打赏
  • 举报
回复
明白了....
谢谢各位
wangk 2010-05-11
  • 打赏
  • 举报
回复


1.注册通知后得到WM_DEVICECHANGE消息通知

2.wParam==DBT_DEVICEREMOVECOMPLETE,lParam == DEV_BROADCAST_HDR *

3. DEV_BROADCAST_HDR.dbch_devicetype == DBT_DEVTYP_VOLUME
lParam == DEV_BROADCAST_VOLUME *

这时候根据结构的就能计算出盘符。
ziplj 2010-05-11
  • 打赏
  • 举报
回复
2L好歹在CSDN混了这么长时间 贴代码和新注册的怎么一点区别都没有 ?
ziplj 2010-05-11
  • 打赏
  • 举报
回复
给你段代码 你就明白了


//截获U盘插入消息
LRESULT CFileRecoveryDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
if(message == WM_DEVICECHANGE)
{
UINT Event = (UINT) wParam;
DWORD dwData = (DWORD) lParam;
PDEV_BROADCAST_HDR pDev_Hdr = (PDEV_BROADCAST_HDR)lParam;

switch(Event)
{
case(DBT_DEVICEARRIVAL):
switch(pDev_Hdr->dbch_devicetype)
{
case(DBT_DEVTYP_VOLUME): //U盘插入消息
GetAllDrives();
break;
}
break;

case(DBT_DEVICEREMOVECOMPLETE):
switch(pDev_Hdr->dbch_devicetype)
{
case(DBT_DEVTYP_VOLUME): //U盘拔出消息
PDEV_BROADCAST_VOLUME pDev_Vol = (PDEV_BROADCAST_VOLUME)pDev_Hdr;
//获取拔出U盘的盘符
DWORD dwDrive = pDev_Vol->dbcv_unitmask;
int i = 0;
for (i = 0 ; i < 32 ; i++)
{
if (dwDrive & (1 << i) ) //找到第一个可用的逻辑盘符
break;
}
Delete_A_Drive('A' + i);
break;
}
break;

default:
break;
}
return(0);
}

return CDialog::WindowProc(message, wParam, lParam);
}


Delete_A_Drive里面的参数就是盘符
fangchao918628 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wangk 的回复:]
WM_DEVICECHANGE的DBT_DEVICEREMOVECOMPLETE如果是DBT_DEVTYP_VOLUME的话,你得到盘符。
[/Quote]
没怎么看明白..
这个得到盘符是怎么得到的...还是不很清楚
jyh_baoding 2010-05-11
  • 打赏
  • 举报
回复
查WINDOWS驱动
许文君 2010-05-11
  • 打赏
  • 举报
回复
in your WM_DEVICECHANGE message handler, you can enum hardware to check if USB is plugged in or off.
//HOWTO: Enumerate Hardware Devices by Using SetupDi Calls Q259695

#include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>
#pragma comment(lib,"Setupapi.lib")
void printdata(LPVOID pdata,DWORD datalen,DWORD type);

int main( int argc, char *argv[ ], char *envp[ ] )
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;

// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(NULL,
0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_ALLCLASSES );

if (hDevInfo == INVALID_HANDLE_VALUE)
{
// Insert error handling here.
return 1;
}

// Enumerate through all devices in Set.

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
&DeviceInfoData);i++)
{
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;

//
// Call function with null to begin with,
// then use the returned buffer size
// to Alloc the buffer. Keep calling until
// success or an unknown failure.
//
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_DEVICEDESC,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (char*)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
printf("SPDRP_DEVICEDESC:[%s]\n",buffer);
if (buffer) LocalFree(buffer);

buffer =NULL;
buffersize=0;
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_LOCATION_INFORMATION,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (char*)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
printf("SPDRP_LOCATION_INFORMATION:[%s]\n",buffer);
if (buffer) LocalFree(buffer);

buffer =NULL;
buffersize=0;
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_ADDRESS,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (char*)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
printf("Length:%d,SPDRP_ADDRESS:",buffersize);
printdata(buffer,buffersize,DataT);
printf("\n");
if (buffer) LocalFree(buffer);

}


if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
// Insert error handling here.
return 1;
}

// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);

return 0;
}

void printdata(LPVOID pdata,DWORD datalen,DWORD type)
{
if(datalen<=0)
return;
switch(type)
{
case REG_DWORD:
{
PDWORD np=(PDWORD)pdata;
printf("REG_DWORD:%d",np[0]);
}
break;
case REG_SZ:
printf("REG_SZ:%d",(LPCTSTR)pdata);
break;
default:
printf("other format");
break;
}
}
//HOWTO: Force Reenumeration of a Device Tree From an Application Q259697


//after I connect usb harddisk to computer, the following is found
//Result:[USB Mass Storage Device]
//Result:[Disk drive]

//There are 2 usb port on my computer, I plug my removable disk into one port, I get the following result,
//SPDRP_DEVICEDESC:[USB Root Hub]
//SPDRP_LOCATION_INFORMATION:[(null)]
//Length:4,SPDRP_ADDRESS:REG_DWORD:0
//SPDRP_DEVICEDESC:[USB Mass Storage Device]
//SPDRP_LOCATION_INFORMATION:[ScanLogic USBIDE]
//Length:4,SPDRP_ADDRESS:REG_DWORD:1
//SPDRP_DEVICEDESC:[Disk drive]
//SPDRP_LOCATION_INFORMATION:[(null)]
//Length:4,SPDRP_ADDRESS:REG_DWORD:1
//when I plug removable usb harddisk into the other port, I get the following result
//SPDRP_DEVICEDESC:[USB Root Hub]
//SPDRP_LOCATION_INFORMATION:[(null)]
//Length:4,SPDRP_ADDRESS:REG_DWORD:0
//SPDRP_DEVICEDESC:[USB Mass Storage Device]
//SPDRP_LOCATION_INFORMATION:[ScanLogic USBIDE]
//Length:4,SPDRP_ADDRESS:REG_DWORD:2
//SPDRP_DEVICEDESC:[Disk drive]
//SPDRP_LOCATION_INFORMATION:[(null)]
//Length:4,SPDRP_ADDRESS:REG_DWORD:2
//unplug the usb removable disk, result is the following
//SPDRP_DEVICEDESC:[USB Root Hub]
//SPDRP_LOCATION_INFORMATION:[(null)]
//Length:4,SPDRP_ADDRESS:REG_DWORD:0
wangk 2010-05-11
  • 打赏
  • 举报
回复
WM_DEVICECHANGE的DBT_DEVICEREMOVECOMPLETE如果是DBT_DEVTYP_VOLUME的话,你得到盘符。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧