在程序中移除U盘

  #include      
  #include      
  #include      
    
  #define   DWORD_PTR   DWORD   
  #define   ULONG_PTR   DWORD   
    
    
  extern   "C"   {     
  #include   "hidsdi.h"     
  }   
  //   需加入hid.lib 
  
  #include   
  #include      
  #pragma comment(lib,"setupapi.lib")    
    
  #include      
  #include      
    
  #include      
  #pragma comment(lib,"cfgmgr32.lib")
  
  #include      
  //#include      
  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;   
  }

  说明:

cr  = CM_Request_Device_Eject( DeviceInfoData.DevInst,   &pnpvietotype,   vetoname,  len,  0  ); //没有气泡提示
cr  = CM_Request_Device_Eject( DeviceInfoData.DevInst,   &pnpvietotype,   NULL,  0,  0  ); //这样就有气泡提示了。

对于CM_Request_Device_Eject这类在DDK中的函数,可以有如下几种方法
1.把DDK的头文件路径和库包含进来,但头文件包含必须使用 
extern   "C"  
{    
  #include   "hidsdi.h"    
}  
2. 把DDK里的相关文件拷到工程里来
3. 用GetProcAddress从相关DLL中取得函数来执行。

 

这种办法只能移除所有的U盘,没法移除某一盘符对应的U盘

你可能感兴趣的:(VC/MFC)