文書番号: 259695 - 最終更新日: 2005年11月29日 - リビジョン: 5.0

SetupDi を使用してハードウェア機器を列挙する方法

この記事は、以前は次の ID で公開されていました: JP259695
すべて展開する | すべて折りたたむ

概要

Windows NT 以降のバージョンでは、インストールされているハードウェア デバイスの一覧を取得するために、アプリケーションで SetupDi クラスの API 関数を使用することができます。

詳細

インストールされているすべてのハードウェア デバイスの一覧を表示する方法を、以下のコードで紹介します。
   #include <stdio.h>
   #include <windows.h>
   #include <setupapi.h>
   #include <devguid.h>
   #include <regstr.h>

   int main( int argc, char *argv[ ], char *envp[ ] )
   {
       HDEVINFO hDevInfo;
       SP_DEVINFO_DATA DeviceInfoData;
       DWORD i;

       // Create a HDEVINFO with all present devices.
       hDevInfo = SetupDiGetClassDevs(NULL,
           0, // Enumerator
           0,
           DIGCF_PRESENT | DIGCF_ALLCLASSES );
       
       if (hDevInfo == INVALID_HANDLE_VALUE)
       {
           // Insert error handling here.
           return 1;
       }
       
       // Enumerate through all devices in Set.
       
       DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
       for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
           &DeviceInfoData);i++)
       {
           DWORD DataT;
           LPTSTR buffer = NULL;
           DWORD buffersize = 0;
           
           //
           // Call function with null to begin with, 
           // then use the returned buffer size (doubled)
           // to Alloc the buffer. Keep calling until
           // success or an unknown failure.
           //
           //  Double the returned buffersize to correct
           //  for underlying legacy CM functions that 
           //  return an incorrect buffersize value on 
           //  DBCS/MBCS systems.
           // 
           while (!SetupDiGetDeviceRegistryProperty(
               hDevInfo,
               &DeviceInfoData,
               SPDRP_DEVICEDESC,
               &DataT,
               (PBYTE)buffer,
               buffersize,
               &buffersize))
           {
               if (GetLastError() == 
                   ERROR_INSUFFICIENT_BUFFER)
               {
                   // Change the buffer size.
                   if (buffer) LocalFree(buffer);
                   // Double the size to avoid problems on 
                   // W2k MBCS systems per KB 888609. 
                   buffer = LocalAlloc(LPTR,buffersize * 2);
               }
               else
               {
                   // Insert error handling here.
                   break;
               }
           }
           
           printf("Result:[%s]\n",buffer);
           
           if (buffer) LocalFree(buffer);
       }
       
       
       if ( GetLastError()!=NO_ERROR &&
            GetLastError()!=ERROR_NO_MORE_ITEMS )
       {
           // Insert error handling here.
           return 1;
       }
       
       //  Cleanup
       SetupDiDestroyDeviceInfoList(hDevInfo);
       
       return 0;
   }
				
: SetupDiGetDeviceRegistryProperty 関数は、Microsoft Windows 2000 を実行中のマルチバイト文字セット (MBCS) システムでは誤った RequiredSize 値を返します。この資料に記載されるサンプル コードでは、RequiredSize 値を 2 倍にすることで、この問題を回避しています。

以下のコードは、PCI (Peripheral Component Interconnect) バスのすべてのデバイスを取得する方法を示しています。
    hDevInfo = SetupDiGetClassDevs(NULL,
        REGSTR_KEY_PCIENUM, // Enumerator
        0,
        DIGCF_PRESENT | DIGCF_ALLCLASSES );
				
構成マネージャの API 関数など、デバイスのインスタンス ハンドルを必要とする Windows API 関数は、SetupDiEnumDeviceInfo 関数によって返される SP_DEVINFO_DATA 構造体の DevInst の値を使用することができます。

関連情報

SetupDi API 呼び出しについては、DDK (Device Development Kit) のドキュメントを参照してください。デバイスの列挙方法を示すサンプル コードについては、DDK の DevCon サンプル コード (src\setup\devcon) を参照してください。

関連情報

なお、この資料は英語版の翻訳であり、日本語環境での確認は行っておりません。

この資料は以下の製品について記述したものです。
  • Microsoft Windows NT 4.0 Driver Development Kit (DDK)
  • Microsoft Win32 Device Driver Kit for Windows 2000
  • Microsoft Windows XP Driver Development Kit (DDK)
  • Microsoft Windows Server 2003 Driver Development Kit (DDK)
キーワード:?
kbhowto kbwdm KB259695
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
 

サポート技術情報の翻訳