Tôi gặp sự cố với chức năng đơn giản trong chương trình của mình, chức năng đó (được liệt kê bên dưới) sẽ tìm thiết bị có mã số HardwareId rồi bật/tắt. Nó tìm thấy nó nhưng sau đó tôi nhận được lỗi, và GetLastError() trả về giá trị trong số được mô tả trong phạm vi msdn. Tôi đã đánh dấu lỗi trong mã với nhận xét. Nếu bất cứ ai nhìn thấy điều này là quen thuộc với SetupDiCallClassInstaller(), vui lòng trợ giúp. Tôi không biết nơi để tìm kiếm lỗi đó và nếu nó là lỗi mã hoặc hệ thống env. Tôi đang sử dụng Windows 7 64-bit và chạy chương trình này với tư cách quản trị viên.Tắt thiết bị
bool DisableInterface(bool bStatus) {
IN LPTSTR HardwareId;
HardwareId = L"DAUDIO\\FUNC_01&VEN_10DE&DEV_0018&SUBSYS_10DE0101";
DWORD NewState ;
if(bStatus) {
NewState = DICS_DISABLE;
}
else {
NewState = DICS_ENABLE;
}
DWORD i, err;
bool found = false;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA spDevInfoData ;
hDevInfo=SetupDiGetClassDevs(NULL, 0, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
if(hDevInfo == INVALID_HANDLE_VALUE)
{
printf("blad1");
return false;
}
spDevInfoData.cbSize=sizeof(SP_DEVINFO_DATA);
for(i=0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++)
{
DWORD DataT;
LPTSTR p, buffer = NULL;
DWORD buffersize = 0;
// get all devices info
while(!SetupDiGetDeviceRegistryProperty(hDevInfo,
&spDevInfoData,
SPDRP_HARDWAREID,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if(GetLastError() == ERROR_INVALID_DATA) {
break ;
}
else if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
if(buffer)
LocalFree(buffer);
buffer = (wchar_t*)LocalAlloc(LPTR,buffersize);
}
else {
goto cleanup_DeviceInfo;
}
}
if(GetLastError() == ERROR_INVALID_DATA)
continue;
//find device with HardwerId
for(p = buffer; *p && (p<&buffer[buffersize]) ; p += lstrlen(p) + sizeof(TCHAR)) {
if(!_tcscmp(HardwareId, p)) {
found = true;
break;
}
}
if(buffer)
LocalFree(buffer);
// if device found change it's state
if(found)
{
SP_PROPCHANGE_PARAMS params;
params.ClassInstallHeader.cbSize=sizeof(SP_CLASSINSTALL_HEADER);
params.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE ;
params.Scope=DICS_FLAG_GLOBAL ;
params.StateChange = NewState ;
// setup proper parameters
if(!SetupDiSetClassInstallParams(hDevInfo, &spDevInfoData, ¶ms.ClassInstallHeader, sizeof(params))) {
DWORD errorcode = GetLastError();
}
// use parameters
if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &spDevInfoData)) {
DWORD errorcode = GetLastError(); // error here
}
switch(NewState) {
case DICS_DISABLE :
printf("off");
break;
case DICS_ENABLE :
printf("on");
break;
}
break;
}
}
cleanup_DeviceInfo :
err = GetLastError();
SetupDiDestroyDeviceInfoList(hDevInfo);
SetLastError(err);
return true;
}
Cảm ơn bạn đã trợ giúp.
Vậy mã lỗi là gì? (Doh!) – atzz
Và thông điệp từ 'FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, ...)' là gì? – MSalters
Nếu tôi sử dụng nó một cách chính xác nó trả về: "(null) tắt" và mã số lỗi là 3758096949, sry cho mất tích đó ..; D – user1668674