整容说文库 > 程序代码 > 教育资讯

想把下面这个程序改成可以禁用usb的可是编译有两个错误,达人们帮忙看看好吗

来源:学生作业帮助网 编辑:整容说文库 时间:2019/06/25 19:29:51 程序代码
想把下面这个程序改成可以禁用usb的可是编译有两个错误,达人们帮忙看看好吗程序代码
我想把下面这个程序改成可以禁用usb的可是编译有两个错误,达人们帮忙看看好吗

01.cpp
F:\01.cpp(127) : error C2065: 'GuidFromString' : undeclared identifier
F:\01.cpp(154) : error C2065: 'StateChange' : undeclared identifier
Error executing cl.exe.

// 必要的头文件和要链接的LIB文件

#include<windows.h>
#include<tchar.h> 
#include<objbase.h>
#include <initguid.h>


#include<setupapi.h>
#include<shlwapi.h>



#pragma comment(lib, "setupapi.lib")
#pragma comment(lib, "shlwapi.lib") 

// device information set(我把它译为设备信息集)
HDEVINFO hDevInfo = NULL;


/*typedef struct _SP_PROPCHANGE_PARAMS {
    SP_CLASSINSTALL_HEADER ClassInstallHeader;
    DWORD StateChange;
    DWORD Scope;
    DWORD HwProfile;
} SP_PROPCHANGE_PARAMS, *PSP_PROPCHANGE_PARAMS;//*/

//出错信息

void FormatMSG(DWORD dwError,LPTSTR *lpszMsg)
{
BOOL bOK=FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|
FORMAT_MESSAGE_ALLOCATE_BUFFER,NULL,dwError,
MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),
(LPTSTR)lpszMsg,0,NULL);
if(!bOK)
{
HMODULE hDll=LoadLibraryEx(_T("netmsg.dll"),NULL,DONT_RESOLVE_DLL_REFERENCES);
if(hDll=NULL)
{
FormatMessage(FORMAT_MESSAGE_FROM_HMODULE|
FORMAT_MESSAGE_FROM_SYSTEM,hDll,dwError,
MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),
(LPTSTR)lpszMsg,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(lpszMsg!=NULL)
{
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(nStatus==-1)
{
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");
GuidFromString((unsigned char *)GUIDString,&guid);
break;
case 1://1代表光驱
GUIDString=_T("4D36E965-E325-11CE-BFC1-08002BE10318");
GuidFromString((unsigned char *)GUIDString,&guid);
break;
case 2://2代表USB
GUIDString=_T("36FC9E60-C465-11CF-8056-444553540000");
GuidFromString((unsigned char *)GUIDString,&guid);
break;
}
hDevInfo=SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT);
if(INVALID_HANDLE_VALUE==hDevInfo)
{
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(nStatus==1)
{
StateChange(DICS_ENABLE,i,hDevInfo);
}
else if(nStatus==0)
{
StateChange(DICS_DISABLE,i,hDevInfo);
}
}
//释放device information set
return SetupDiDestroyDeviceInfoList(hDevInfo);
}
catch(TCHAR *pszError)
{
::MessageBox(NULL,pszError,_T("提示"),MB_OK);
if(lpszMsg!=NULL)
{
LocalFree((HLOCAL)lpszMsg);
}
return FALSE;
}
return FALSE;
}
void main()
{
ControlDisk(0,2);
}
'GuidFromString' 可能是自己编写的程序
改称UuidFromString;只会拷贝粘贴的程序员不是一个好程序员,有了代码多少也看上一眼。。。
我看到的程序本来是UuidFromString的,我觉得不对就给改了,结果还露怯了,呵呵多谢煽风点火

那StateChange是怎么错了啊?
谢谢大家了,又添加了一个库,程序可以运行了.不过程序不是我自己编的,
哪位可以给解释一下它的实现原理啊,尤其是ChangeStatus这个函数
多谢多谢
程序代码