关于U盘的安全退出,效果是和鼠标点击右下角的绿色箭头效果一样,高手给说说,解决了一定有丰厚的报酬啊!在MFC下,尽量简单一点啊,可以不用底层代码就不用,反正是给出最佳的解决方案吧!

解决方案 »

  1.   

    #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;   
      }
      

  2.   

    大侠,我现在已经实现了U盘的识别,还有就是U盘的安全退出了,我做的是基于对话框的MFC程序啊,要用DDK吗?1楼的高手用的是API写得吧,里面包含的文件貌似是DDK的吧!我要的效果是像正常的点击屏幕右下角的绿色箭头一样啊!在M对话框里面怎么加啊,必须要用DDK吗?有没有简单点的,小弟没学过DDK啊,貌似很复杂啊~大家关注一下啊,多多提意见啊!主要问题就是U盘的安全退出···
      

  3.   


    如果楼主不想用DDK,是搞不定的,因为你想实现U盘的安全退出,只能通过底层函数来获取退出的标志或者信息,然后通过你的MFC程序来模拟退出信息,这样就行了,不过还是要用到DDK,如果你不会用,可以到网上搜索一下DDK函数的使用,其实很简单的,只是你没用过,或者用的少了而已。兄弟,我感觉如果你觉得复杂就不去学习,这样对搞开发的来说不好,呵呵,个人建议。
      

  4.   

    呵呵,1楼的代码已经很清楚了,就是先列举设备,找到设备后再弹出设备。通过Setup里的安装函数接口就可以了,象这种通用设备的控制,微软是直接提供了win32接口的
      

  5.   

    哦,既然大家都认为必须要用DDk的话,我就学吧!不是不愿意学,主要因为今年任务很多,不能凭自己的热情在这些“好玩”的东西上,哎!时间不多,呵呵,非常感谢大家的关注,结贴散分去!