`

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

 
阅读更多
  1. #include<WINDOWS.H>
  2. #include<TCHAR.H>
  3. #include<SETUPAPI.H>
  4. //#include<SHLWAPI.H>
  5. #pragmacomment(lib,"setupapi.lib")
  6. //#pragmacomment(lib,"shlwapi.lib")
  7. HDEVINFOhDevInfo=NULL;
  8. //出错信息
  9. voidFormatMSG(DWORDdwError,LPTSTR*o)
  10. {
  11. LPTSTRoo=(LPTSTR)o;
  12. BOOLbOk=FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER,NULL,dwError,
  13. MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),oo,0,NULL);
  14. if(!bOk)//将**变成*2007/01/10
  15. {//新建的字符串由oo指向。
  16. HMODULEhDll=LoadLibraryEx(_T("netmsg.dll"),NULL,DONT_RESOLVE_DLL_REFERENCES);
  17. if(NULL!=hDll)
  18. {
  19. FormatMessage(FORMAT_MESSAGE_FROM_HMODULE|
  20. FORMAT_MESSAGE_FROM_SYSTEM,hDll,
  21. dwError,
  22. MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),
  23. (LPTSTR)o,0,NULL);
  24. FreeLibrary(hDll);
  25. }
  26. }
  27. }
  28. BOOLChangeStatus(DWORDNewStatus,DWORDSelectedItem,HDEVINFOhDevInfo)
  29. {
  30. LPTSTRlpszMsg=NULL;
  31. HCURSORhCursor=NULL;
  32. try
  33. {
  34. SP_PROPCHANGE_PARAMSPropChangeParams={sizeof(SP_CLASSINSTALL_HEADER)};
  35. SP_DEVINFO_DATADeviceInfoData={sizeof(SP_DEVINFO_DATA)};
  36. hCursor=SetCursor(LoadCursor(NULL,IDC_WAIT));
  37. //GetahandletotheSelectedItem.
  38. if(!SetupDiEnumDeviceInfo(hDevInfo,SelectedItem,&DeviceInfoData))
  39. {
  40. FormatMSG(GetLastError(),&lpszMsg);
  41. throwlpszMsg;
  42. }
  43. //SetthePropChangeParamsstructure.
  44. PropChangeParams.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE;
  45. PropChangeParams.Scope=DICS_FLAG_GLOBAL;
  46. PropChangeParams.StateChange=NewStatus;
  47. if(!SetupDiSetClassInstallParams(hDevInfo,&DeviceInfoData,(SP_CLASSINSTALL_HEADER*)&PropChangeParams,
  48. sizeof(PropChangeParams)))
  49. {
  50. FormatMSG(GetLastError(),&lpszMsg);
  51. throwlpszMsg;
  52. }
  53. //CalltheClassInstallerandperformthechange.
  54. if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&DeviceInfoData))
  55. {
  56. FormatMSG(GetLastError(),&lpszMsg);
  57. throwlpszMsg;
  58. }
  59. SetCursor(hCursor);
  60. returnTRUE;
  61. }
  62. catch(TCHAR*pszError)
  63. {
  64. SetCursor(hCursor);
  65. ::MessageBox(NULL,pszError,_T("提示"),MB_OK);
  66. if(NULL!=lpszMsg)
  67. {
  68. LocalFree((HLOCAL)lpszMsg);
  69. }
  70. returnFALSE;
  71. }
  72. }
  73. //这些设备的启用和禁用主要有此函数实现
  74. //参数说明,nStatus可取3个值,-1:啥也不做
  75. //0禁用设备,1启用设备。
  76. //nIndex用于控制是对光驱,软驱还是对USB启用或禁用
  77. //也是可取3个值,0代表软驱,1代表光驱
  78. //2代表USB
  79. //譬如要对光驱实现禁用,可以这样调用此函数
  80. //ControlDisk(0,1);
  81. BOOLControlDisk(intnStatus,intnIndex)
  82. {
  83. if(-1==nStatus)
  84. {
  85. returnFALSE;
  86. }
  87. LPTSTRlpszMsg=NULL;
  88. try
  89. {
  90. TCHAR*GUIDString=NULL;
  91. GUIDguid;
  92. ZeroMemory(&guid,sizeof(GUID));
  93. switch(nIndex)
  94. {
  95. case0://0代表软驱
  96. GUIDString=_T("4D36E980-E325-11CE-BFC1-08002BE10318");
  97. UuidFromString((unsignedchar*)GUIDString,&guid);
  98. break;
  99. case1://1代表光驱
  100. GUIDString=_T("4D36E965-E325-11CE-BFC1-08002BE10318");
  101. UuidFromString((unsignedchar*)GUIDString,&guid);
  102. break;
  103. case2://2代表USB
  104. GUIDString=_T("36FC9E60-C465-11CF-8056-444553540000");
  105. UuidFromString((unsignedchar*)GUIDString,&guid);
  106. break;
  107. }
  108. hDevInfo=SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT);
  109. if(INVALID_HANDLE_VALUE!=hDevInfo)
  110. {lpszMsg="hahazx";
  111. FormatMSG(GetLastError(),&lpszMsg);
  112. throwlpszMsg;
  113. }
  114. DWORDi;
  115. SP_DEVINFO_DATADeviceInfoData;
  116. ZeroMemory(&DeviceInfoData,sizeof(SP_DEVINFO_DATA));
  117. DeviceInfoData.cbSize=sizeof(SP_DEVINFO_DATA);
  118. for(i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData);++i)
  119. {
  120. if(1==nStatus)
  121. {::MessageBox(NULL,"启用","correct",MB_OK);
  122. ChangeStatus(DICS_ENABLE,i,hDevInfo);
  123. }
  124. elseif(0==nStatus)
  125. {::MessageBox(NULL,"禁用","error",MB_OK);
  126. ChangeStatus(DICS_DISABLE,i,hDevInfo);
  127. }
  128. }
  129. //释放deviceinformationset
  130. returnSetupDiDestroyDeviceInfoList(hDevInfo);
  131. }
  132. catch(TCHAR*pszError)
  133. {
  134. ::MessageBox(NULL,pszError,_T("提示"),MB_OK);
  135. if(NULL!=lpszMsg)
  136. {
  137. LocalFree((HLOCAL)lpszMsg);
  138. }
  139. returnFALSE;
  140. }
  141. returnFALSE;
  142. }
  143. voidmain()
  144. {
  145. ControlDisk(1,2);
  146. }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics