最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲

[公告2019/01/08] 請注意:我再次重申,部落格文章的程式碼,是要提供各位參考與學習,一旦網頁改版請自行修改,別要求東要求西要我主動修改,你們用我寫東西賺錢了、交差了,請問有分我一杯羹嗎?既然賺錢沒分我,請問有什麼理由要求我修改,如果沒能力改,就花錢來找我上課。

[公告2019/12/01] 若各位有 Excel VBA 案子開發需求,歡迎與我聯繫,可接案處理。

[公告2020/05/22] 頁面載入速度慢,起因為部分JS來源(alexgorbatchev.com)失效導致頁面載入變慢,目前已做調整,請多見諒。

2013年5月11日 星期六

取得系統中裝置例項路徑(Device Instance Path)

取得系統中裝置例項路徑(Device Instance Path)
利用API SetupDiGetClassDevs、SetupDiEnumDeviceInterfaces、SetupDiGetDeviceInterfaceDetail抓出指定的裝置資訊,以下範例為抓取Disk的裝置例項路徑
BOOL ListDeviceInstancePath()
{
  HDEVINFO hdev;
  DWORD idx;
  GUID guid = GUID_DEVINTERFACE_DISK;
  CString csDevicePath;
  BOOL bRet = TRUE;
  BOOL nStatus;
  DWORD dwSize = 0;

  hdev = SetupDiGetClassDevs( &guid,
                           NULL,
                           NULL,
                           DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
  if (hdev == INVALID_HANDLE_VALUE )
  {
    printf("ERROR : Unable to enumerate device.\n");
    return FALSE;
  }
  
  SP_DEVICE_INTERFACE_DATA  DeviceInterfaceData;
  DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData);
  
  for (idx = 0 ; SetupDiEnumDeviceInterfaces(hdev, NULL, &guid, idx, &DeviceInterfaceData); idx++)
  {
    nStatus = SetupDiGetDeviceInterfaceDetail(hdev, &DeviceInterfaceData, NULL, 0, &dwSize, NULL);
    if (!dwSize)
    {
      bRet = FALSE;
      printf("ERROR : SetupDiGetDeviceInterfaceDetail fial.\n");
      break;
    }
    
    PSP_DEVICE_INTERFACE_DETAIL_DATA pBuffer = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(dwSize);
    ZeroMemory(pBuffer, sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA));
    pBuffer->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
    
    SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};
    nStatus = SetupDiGetDeviceInterfaceDetail(hdev, &DeviceInterfaceData, pBuffer, dwSize, &dwSize, &DeviceInfoData);
    if(!nStatus)
    {
      bRet = FALSE;
      printf("ERROR : SetupDiGetDeviceInterfaceDetail fial.\n");
      break;
    }
    csDevicePath = pBuffer->DevicePath;  
    csDevicePath.MakeUpper(); 
    printf("%s\n", csDevicePath);
  }
  SetupDiDestroyDeviceInfoList(hdev);
  
  return bRet;
}
抓取畫面

沒有留言:

張貼留言