最后一次U盘求助(MFC安全退出U盘) 关于U盘的安全退出,效果是和鼠标点击右下角的绿色箭头效果一样,高手给说说,解决了一定有丰厚的报酬啊!在MFC下,尽量简单一点啊,可以不用底层代码就不用,反正是给出最佳的解决方案吧! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #include <tchar.h> #include <stdio.h> #include <windows.h> #include <devguid.h> #define DWORD_PTR DWORD #define ULONG_PTR DWORD extern "C" { #include "hidsdi.h" } // 需加入hid.lib #include <setupapi.h> // 需加入setupapi.lib #include <regstr.h> #include <winbase.h> #include <cfgmgr32.h> // 需要加入cfgmgr32.lib #include <initguid.h> //#include <usbiodef.h> DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED); #define GUID_CLASS_USB_DEVICE GUID_DEVINTERFACE_USB_DEVICE int main(int argc, _TCHAR* argv[]) { HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; DWORD i; //-------------------------------------------------------------------------- // 获取设备信息 hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE, 0, // Enumerator 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE ); if (hDevInfo == INVALID_HANDLE_VALUE) { // 查询信息失败 printf("ERROR - SetupDiGetClassDevs()"); return 1; } //-------------------------------------------------------------------------- // 枚举每个USB设备 DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); for (i=0;SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);i++) { LPTSTR buffer = NULL; PVOID buffer2 = NULL; DWORD buffersize = 0; ULONG len; CONFIGRET cr; PNP_VETO_TYPE pnpvietotype; CHAR vetoname[MAX_PATH]; ULONG ulStatus; ULONG ulProblemNumber; cr = CM_Get_DevNode_Status( &ulStatus, &ulProblemNumber, DeviceInfoData.DevInst, 0); if ( CR_SUCCESS == cr ) { printf("OK - CM_Get_DevNode_Status()[%d]\n", cr); printf("OK - CM_Get_DevNode_Status() sts [%x]\n", ulStatus); printf("OK - CM_Get_DevNode_Status() pro [%x]\n", ulProblemNumber); } else { printf("ERROR - CM_Get_DevNode_Status()[%d]\n", cr); printf("ERROR - CM_Get_DevNode_Status()[%d]\n", GetLastError()); } // DN_DISABLEABLE or DN_REMOVABLE if ((DN_DISABLEABLE & ulStatus ) != 0 ) { printf("HAS - DN_DISABLEABLE()[%x]\n", DN_DISABLEABLE & ulStatus); } else { continue; } if ((DN_REMOVABLE & ulStatus ) != 0 ) { printf("HAS - DN_REMOVABLE()[%x]\n", DN_REMOVABLE & ulStatus); } else { continue; } len = MAX_PATH; // pnpvietotype = PNP_VetoDevice; cr = CM_Request_Device_Eject( DeviceInfoData.DevInst, &pnpvietotype, vetoname, len, 0 ); if ( CR_SUCCESS == cr ) { printf("OK - CM_Request_Device_Eject()[%d]\n", cr); } else { printf("ERROR - CM_Request_Device_Eject()[%d]\n", cr); printf("ERROR - CM_Request_Device_Eject()[%d]\n", GetLastError()); } } if ( GetLastError()!=NO_ERROR && GetLastError()!=ERROR_NO_MORE_ITEMS ) { // Insert error handling here. return 1; } // Cleanup SetupDiDestroyDeviceInfoList(hDevInfo); return 0; } 大侠,我现在已经实现了U盘的识别,还有就是U盘的安全退出了,我做的是基于对话框的MFC程序啊,要用DDK吗?1楼的高手用的是API写得吧,里面包含的文件貌似是DDK的吧!我要的效果是像正常的点击屏幕右下角的绿色箭头一样啊!在M对话框里面怎么加啊,必须要用DDK吗?有没有简单点的,小弟没学过DDK啊,貌似很复杂啊~大家关注一下啊,多多提意见啊!主要问题就是U盘的安全退出··· 如果楼主不想用DDK,是搞不定的,因为你想实现U盘的安全退出,只能通过底层函数来获取退出的标志或者信息,然后通过你的MFC程序来模拟退出信息,这样就行了,不过还是要用到DDK,如果你不会用,可以到网上搜索一下DDK函数的使用,其实很简单的,只是你没用过,或者用的少了而已。兄弟,我感觉如果你觉得复杂就不去学习,这样对搞开发的来说不好,呵呵,个人建议。 呵呵,1楼的代码已经很清楚了,就是先列举设备,找到设备后再弹出设备。通过Setup里的安装函数接口就可以了,象这种通用设备的控制,微软是直接提供了win32接口的 哦,既然大家都认为必须要用DDk的话,我就学吧!不是不愿意学,主要因为今年任务很多,不能凭自己的热情在这些“好玩”的东西上,哎!时间不多,呵呵,非常感谢大家的关注,结贴散分去! 如何把此程序用在自己的代码中 强制让windows完成填充TCP数据包的校验和 windows核心编程源代码有VC++的吗? C++中的字典功能如何实现 嵌在网页中的ActiveX控件能否获得所在页面的URL? 请问ChildWindowFromPoint为什么总返回的不是子窗口的句柄呢? ★★★送份啦---如何访问带password的网络共享文件夹 讨论有分:由QQ头像想到的 0xfeeefeee 动画控件 邮件发收 50分控件值的保存问题
#include <stdio.h>
#include <windows.h>
#include <devguid.h>
#define DWORD_PTR DWORD
#define ULONG_PTR DWORD
extern "C" {
#include "hidsdi.h"
}
// 需加入hid.lib
#include <setupapi.h>
// 需加入setupapi.lib
#include <regstr.h>
#include <winbase.h>
#include <cfgmgr32.h>
// 需要加入cfgmgr32.lib
#include <initguid.h>
//#include <usbiodef.h>
DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE,
0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED);
#define GUID_CLASS_USB_DEVICE GUID_DEVINTERFACE_USB_DEVICE
int main(int argc, _TCHAR* argv[])
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
//--------------------------------------------------------------------------
// 获取设备信息
hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE,
0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE );
if (hDevInfo == INVALID_HANDLE_VALUE) {
// 查询信息失败
printf("ERROR - SetupDiGetClassDevs()");
return 1;
}
//--------------------------------------------------------------------------
// 枚举每个USB设备
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);i++)
{
LPTSTR buffer = NULL;
PVOID buffer2 = NULL;
DWORD buffersize = 0;
ULONG len;
CONFIGRET cr;
PNP_VETO_TYPE pnpvietotype;
CHAR vetoname[MAX_PATH];
ULONG ulStatus;
ULONG ulProblemNumber;
cr = CM_Get_DevNode_Status( &ulStatus,
&ulProblemNumber,
DeviceInfoData.DevInst,
0);
if ( CR_SUCCESS == cr ) {
printf("OK - CM_Get_DevNode_Status()[%d]\n", cr);
printf("OK - CM_Get_DevNode_Status() sts [%x]\n", ulStatus);
printf("OK - CM_Get_DevNode_Status() pro [%x]\n", ulProblemNumber);
} else {
printf("ERROR - CM_Get_DevNode_Status()[%d]\n", cr);
printf("ERROR - CM_Get_DevNode_Status()[%d]\n", GetLastError());
}
// DN_DISABLEABLE or DN_REMOVABLE
if ((DN_DISABLEABLE & ulStatus ) != 0 ) {
printf("HAS - DN_DISABLEABLE()[%x]\n", DN_DISABLEABLE & ulStatus);
} else {
continue;
}
if ((DN_REMOVABLE & ulStatus ) != 0 ) {
printf("HAS - DN_REMOVABLE()[%x]\n", DN_REMOVABLE & ulStatus);
} else {
continue;
}
len = MAX_PATH;
// pnpvietotype = PNP_VetoDevice;
cr = CM_Request_Device_Eject(
DeviceInfoData.DevInst,
&pnpvietotype,
vetoname,
len,
0
);
if ( CR_SUCCESS == cr ) {
printf("OK - CM_Request_Device_Eject()[%d]\n", cr);
} else {
printf("ERROR - CM_Request_Device_Eject()[%d]\n", cr);
printf("ERROR - CM_Request_Device_Eject()[%d]\n", GetLastError());
}
}
if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
// Insert error handling here.
return 1;
}
// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}
如果楼主不想用DDK,是搞不定的,因为你想实现U盘的安全退出,只能通过底层函数来获取退出的标志或者信息,然后通过你的MFC程序来模拟退出信息,这样就行了,不过还是要用到DDK,如果你不会用,可以到网上搜索一下DDK函数的使用,其实很简单的,只是你没用过,或者用的少了而已。兄弟,我感觉如果你觉得复杂就不去学习,这样对搞开发的来说不好,呵呵,个人建议。