zoukankan      html  css  js  c++  java
  • vc++实现控制USB设备启用与否

    #include <WINDOWS.H>     
    #include <TCHAR.H>     
    #include <SETUPAPI.H>     
    //#include <SHLWAPI.H>     
    #pragma comment(lib, "setupapi.lib")     
    //#pragma comment(lib, "shlwapi.lib")     
    HDEVINFO hDevInfo = NULL;    
    // 出错信息     
    void FormatMSG(DWORD dwError, LPTSTR * o)    
    {    
        LPTSTR oo=(LPTSTR)o;    
        BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwError,    
            MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), oo, 0, NULL);    
      if(!bOk)                                                  //将**变成*2007 /01 /10     
      {                                                         //新建的字符串由oo指向。     
          HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),NULL,DONT_RESOLVE_DLL_REFERENCES);    
          if(NULL != hDll)    
          {    
            FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |     
            FORMAT_MESSAGE_FROM_SYSTEM,hDll,    
            dwError,    
            MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),    
            (LPTSTR)o,0, NULL);    
            FreeLibrary(hDll);    
          }    
      }    
    }    
    BOOL ChangeStatus(DWORD NewStatus, DWORD SelectedItem, HDEVINFO hDevInfo)    
    {    
        LPTSTR lpszMsg = NULL;    
        HCURSOR hCursor = NULL;    
        try    
        {    
            SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};    
            SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};    
            hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));    
            // Get a handle to the Selected Item.     
            if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))    
            {    
                FormatMSG(GetLastError(), &lpszMsg);    
                throw lpszMsg;    
            }    
            // Set the PropChangeParams structure.     
            PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;    
            PropChangeParams.Scope = DICS_FLAG_GLOBAL;    
            PropChangeParams.StateChange = NewStatus;    
            if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER *)&PropChangeParams,    
                    sizeof(PropChangeParams)))    
            {    
                FormatMSG(GetLastError(), &lpszMsg);    
                throw lpszMsg;    
            }    
        
            // Call the ClassInstaller and perform the change.     
            if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&DeviceInfoData))    
            {    
                FormatMSG(GetLastError(), &lpszMsg);    
                throw lpszMsg;    
            }    
            SetCursor(hCursor);     
            return TRUE;    
        }    
        catch (TCHAR * pszError)    
        {    
            SetCursor(hCursor);    
            ::MessageBox(NULL,pszError,_T("提示"),MB_OK);    
            if (NULL != lpszMsg)    
            {    
                LocalFree((HLOCAL)lpszMsg);    
            }     
            return FALSE;    
        }    
    }    
        
    // 这些设备的启用和禁用主要有此函数实现     
    // 参数说明,nStatus 可取3个值,-1 :啥也不做     
    // 0 禁用设备,1启用设备。     
    // nIndex用于控制是对光驱,软驱还是对USB启用或禁用     
    // 也是可取3个值,0 代表软驱,1 代表光驱     
    // 2 代表USB     
    // 譬如要对光驱实现禁用,可以这样调用此函数     
    // ControlDisk(0, 1);     
    BOOL ControlDisk(int nStatus, int nIndex)    
    {    
        if (-1 == nStatus)    
        {    
            return FALSE;    
        }    
        LPTSTR lpszMsg = NULL;    
        try    
        {    
            TCHAR * GUIDString = NULL;    
            GUID guid;    
            ZeroMemory(&guid, sizeof(GUID));    
            switch(nIndex)    
            {    
                case 0: // 0 代表软驱     
                    GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318");    
                    UuidFromString((unsigned char *)GUIDString, &guid);    
                    break;     
                case 1: // 1 代表光驱     
                    GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318");    
                    UuidFromString((unsigned char *)GUIDString, &guid);    
                    break;    
                case 2: // 2 代表USB     
                    GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000");    
                    UuidFromString((unsigned char *)GUIDString, &guid);    
                    break;    
            }    
            hDevInfo = SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT);    
            if (INVALID_HANDLE_VALUE != hDevInfo)    
            {lpszMsg="hahazx";    
                FormatMSG(GetLastError(), &lpszMsg);    
                    
                throw lpszMsg;    
            }    
            DWORD i;    
            SP_DEVINFO_DATA DeviceInfoData;    
            ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));    
            DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);    
            for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)    
            {    
                if (1 == nStatus)    
                {::MessageBox(NULL,"启用","correct",MB_OK);    
                    ChangeStatus(DICS_ENABLE, i, hDevInfo);    
                }    
                else if (0 == nStatus)    
                {::MessageBox(NULL,"禁用","error",MB_OK);    
                    ChangeStatus(DICS_DISABLE, i, hDevInfo);    
                }     
            }    
            // 释放 device information set     
            return SetupDiDestroyDeviceInfoList(hDevInfo);    
        }    
        catch (TCHAR * pszError)    
        {    
            ::MessageBox(NULL,pszError,_T("提示"),MB_OK);    
            if (NULL != lpszMsg)    
            {    
                LocalFree((HLOCAL)lpszMsg);    
            }    
            return FALSE;    
        }    
        return FALSE;    
    }    
    void main()    
    {    
        ControlDisk(1, 2);    
    }    
  • 相关阅读:
    大数据技术(1-5题)
    如何使用不同的编程语言来造一匹马
    Redis 数据类型及应用场景
    Swoole中内置Http服务器
    redis 数据库主从不一致问题解决方案
    easyswoole对接支付宝,微信支付
    PHP+Swoole 作为网络通信框架
    基于swoole实现多人聊天室
    swoole与php协程实现异步非阻塞IO开发
    swoole中使用task进程异步的处理耗时任务
  • 原文地址:https://www.cnblogs.com/2018shawn/p/9455069.html
Copyright © 2011-2022 走看看