我有一個相當有趣的問題,我無法找到解決方案。我使用安裝程序API列出系統中的驅動器。將枚舉器設置爲「IDE」時,使用下面列出的代碼毫無問題。枚舉值設置爲「SCSI」時,我的焦慮來了。重現此問題的代碼如下:SetupDiGetClassDevs列出SCSI驅動器失敗,錯誤代碼13(ERROR_INVALID_DATA)
#include <iostream>
#include <Windows.h>
#include <SetupAPI.h>
#include <cfgmgr32.h>
#include <devguid.h>
int main() {
std::cout << "Looking for only SCSI disks" << std::endl;
HDEVINFO hDevs(SetupDiGetClassDevs(&GUID_DEVCLASS_DISKDRIVE, "SCSI", NULL, DIGCF_PRESENT));
if(INVALID_HANDLE_VALUE == hDevs) {
DWORD error(GetLastError());
std::cout << "Handle returned is invalid. Error code: " << error << std::endl;
return 1;
}
SP_DEVINFO_DATA sp = {sizeof(SP_DEVINFO_DATA)};
char buff[256];
memset(buff, 0, 256);
DWORD index(0);
std::cout << "The handle is valid, listing drives now" << std::endl;
while(SetupDiEnumDeviceInfo(hDevs, index++, &sp)) {
CM_Get_Device_ID(sp.DevInst, buff, 256, 0);
std::cout << buff << std::endl;
memset(buff, 0, 256);
}
SetupDiDestroyDeviceInfoList(hDevs);
return 0;
}
正如你所看到的,這段代碼沒有什麼值得注意的。問題是,在某些筆記本電腦上,SetupDiGetClassDevs()的代碼錯誤。檢查GetLastError()會發現它的ERROR_INVALID_DATA(0xd)失敗。我不明白的是爲什麼。這個完全相同的程序,作爲我的用戶(具有管理員權限)和非特權用戶在我的開發框中運行,無論SCSI驅動器是否存在都可以工作。
我知道使用的GUID是正確的。它在devguid.h中定義。 「SCSI」是此MSDN page中引用的有效PnP枚舉器,也是檢查設備管理器中的「枚舉器」屬性。第三個參數可以是NULL,第四個參數是該函數的有效定義標誌。我知道這一點,因爲除了這些筆記本電腦以外,這個系統可以在我嘗試過的所有系統上使用(在我的組織中,這個系統有很多)。我希望這裏的某個人可能知道什麼會導致SetupDiGetClassDevs()在這些情況下失敗,或者至少可以將我指向正確的方向。我不是Windows專家,我可能會錯過系統配置或權限(雖然不是從錯誤中隱含的)。
正如我所希望的那樣,我已經在一臺筆記本電腦上運行這個代碼,我可以作爲具有管理員權限的用戶和管理員用戶進行測試:兩者都具有相同的結果。筆記本電腦是運行Windows 7 64位Service Pack 1的HP EliteBook 8460p。以32位或64位編譯此代碼沒有區別。
您的錯誤處理是borken。在執行其他任何操作前,總是獲取GetLastError()**的值,包括寫入cout。 –
有趣。我不知道,但似乎有理由。我已將代碼更改爲編輯顯示的內容。我仍然收到錯誤代碼13(0xd)。 –