- #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);
- }
vc++实现控制USB设备启用与否
最新推荐文章于 2022-08-31 15:43:42 发布
本文介绍了一个Windows平台下的设备控制程序,能够实现对指定类型的设备(如软驱、光驱和USB设备)进行启用或禁用操作。通过枚举指定GUID的设备信息,并调用Windows API函数来更改设备状态。
5738

被折叠的 条评论
为什么被折叠?



