六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 31|回复: 0

vc++实现控制USB设备启用与否

[复制链接]

升级  11.82%

1179

主题

1179

主题

1179

主题

榜眼

Rank: 8Rank: 8

积分
3591
 楼主| 发表于 2013-2-7 03:32:46 | 显示全部楼层 |阅读模式

  • #include<WINDOWS.H>
  • #include<TCHAR.H>
  • #include<SETUPAPI.H>
  • //#include<SHLWAPI.H>
  • #pragmacomment(lib,"setupapi.lib")
  • //#pragmacomment(lib,"shlwapi.lib")
  • HDEVINFOhDevInfo=NULL;
  • //出错信息
  • voidFormatMSG(DWORDdwError,LPTSTR*o)
  • {
  • LPTSTRoo=(LPTSTR)o;
  • BOOLbOk=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指向。
  • HMODULEhDll=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);
  • }
  • }
  • }
  • BOOLChangeStatus(DWORDNewStatus,DWORDSelectedItem,HDEVINFOhDevInfo)
  • {
  • LPTSTRlpszMsg=NULL;
  • HCURSORhCursor=NULL;
  • try
  • {
  • SP_PROPCHANGE_PARAMSPropChangeParams={sizeof(SP_CLASSINSTALL_HEADER)};
  • SP_DEVINFO_DATADeviceInfoData={sizeof(SP_DEVINFO_DATA)};
  • hCursor=SetCursor(LoadCursor(NULL,IDC_WAIT));
  • //GetahandletotheSelectedItem.
  • if(!SetupDiEnumDeviceInfo(hDevInfo,SelectedItem,&DeviceInfoData))
  • {
  • FormatMSG(GetLastError(),&lpszMsg);
  • throwlpszMsg;
  • }
  • //SetthePropChangeParamsstructure.
  • 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);
  • throwlpszMsg;
  • }

  • //CalltheClassInstallerandperformthechange.
  • if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&DeviceInfoData))
  • {
  • FormatMSG(GetLastError(),&lpszMsg);
  • throwlpszMsg;
  • }
  • SetCursor(hCursor);
  • returnTRUE;
  • }
  • catch(TCHAR*pszError)
  • {
  • SetCursor(hCursor);
  • ::MessageBox(NULL,pszError,_T("提示"),MB_OK);
  • if(NULL!=lpszMsg)
  • {
  • LocalFree((HLOCAL)lpszMsg);
  • }
  • returnFALSE;
  • }
  • }

  • //这些设备的启用和禁用主要有此函数实现
  • //参数说明,nStatus可取3个值,-1:啥也不做
  • //0禁用设备,1启用设备。
  • //nIndex用于控制是对光驱,软驱还是对USB启用或禁用
  • //也是可取3个值,0代表软驱,1代表光驱
  • //2代表USB
  • //譬如要对光驱实现禁用,可以这样调用此函数
  • //ControlDisk(0,1);
  • BOOLControlDisk(intnStatus,intnIndex)
  • {
  • if(-1==nStatus)
  • {
  • returnFALSE;
  • }
  • LPTSTRlpszMsg=NULL;
  • try
  • {
  • TCHAR*GUIDString=NULL;
  • GUIDguid;
  • ZeroMemory(&guid,sizeof(GUID));
  • switch(nIndex)
  • {
  • case0://0代表软驱
  • GUIDString=_T("4D36E980-E325-11CE-BFC1-08002BE10318");
  • UuidFromString((unsignedchar*)GUIDString,&guid);
  • break;
  • case1://1代表光驱
  • GUIDString=_T("4D36E965-E325-11CE-BFC1-08002BE10318");
  • UuidFromString((unsignedchar*)GUIDString,&guid);
  • break;
  • case2://2代表USB
  • GUIDString=_T("36FC9E60-C465-11CF-8056-444553540000");
  • UuidFromString((unsignedchar*)GUIDString,&guid);
  • break;
  • }
  • hDevInfo=SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT);
  • if(INVALID_HANDLE_VALUE!=hDevInfo)
  • {lpszMsg="hahazx";
  • FormatMSG(GetLastError(),&lpszMsg);

  • throwlpszMsg;
  • }
  • DWORDi;
  • SP_DEVINFO_DATADeviceInfoData;
  • 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);
  • }
  • elseif(0==nStatus)
  • {::MessageBox(NULL,"禁用","error",MB_OK);
  • ChangeStatus(DICS_DISABLE,i,hDevInfo);
  • }
  • }
  • //释放deviceinformationset
  • returnSetupDiDestroyDeviceInfoList(hDevInfo);
  • }
  • catch(TCHAR*pszError)
  • {
  • ::MessageBox(NULL,pszError,_T("提示"),MB_OK);
  • if(NULL!=lpszMsg)
  • {
  • LocalFree((HLOCAL)lpszMsg);
  • }
  • returnFALSE;
  • }
  • returnFALSE;
  • }
  • voidmain()
  • {
  • ControlDisk(1,2);
  • }
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表