vc++实现控制USB设备启用与否
[*]#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);
[*]}
页:
[1]