So-net無料ブログ作成
検索選択

VC++でシリアルポートの情報を取得 [仕事とプログラムのハナシ]

デバイスマネージャで表示される情報が欲しかったので探してみた。

欲しかったのは
各デバイスを右クリックして「プロパティ」を開いたときに表示される
「詳細」タブ内「デバイス インスタンスID」の情報。

こないだ書いた日記の『列挙』までは同じ。
で、列挙で取得したデバイスを
SetupDiGetDeviceInstanceId関数に渡すと
「デバイス インスタンスID」に表示されるものと同じものが取得できた。
# これはWMIのPNPDeviceIDで取得できる情報と同じもの

ついでに、COMポート番号もリストに並べたかったので
SetupDiOpenDevRegKey関数とRegQueryValueEx関数で取得。
(これの使い方は、件のEnumSerial云々のソースがわかりやすい。)
# これはWMIのDeviceIDで取得できる情報と同じもの


欲しい情報が取れたので、コレにて終了。
あー、スッキリした。

++++++++++ 2009/10/13加筆 ++++++++++
「VC」「MFC」「シリアルポート」「列挙」などの検索ワードでググって
このブログに辿りつく方が多いようなので、ソースをのっけることにしました。

SetupDiGetDeviceRegistryProperty()でプロパティを取得したり、
SetupDiGetDeviceInstanceId()でインスタンスIDを取得したりして、
メッセージボックスで表示するという簡単なものです・・・が、長いです。
(動作確認実験に使ったソースなのでマトモに表示されないものも含まれています)

※ソースについて当方では責任を持ちませんので
 あしからずご了承ください。(自分の環境で試してみてくださいね)


// 色々初期化
 DWORD i;
 BYTE Buffer[256]; //領域確保(てきとう)
 DWORD Length = 0;
 HWND hwndDlg = this->GetSafeHwnd(); //ダイアログのハンドル取得
 SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)}; /// 1件デバイス情報
 HDEVINFO hDevInfo = 0; // 列挙デバイス情報

// COMポートのデバイス情報を取得
 hDevInfo = SetupDiGetClassDevs( &GUID_DEVINTERFACE_COMPORT, NULL, hwndDlg, ( DIGCF_PRESENT | DIGCF_DEVICEINTERFACE ) );


 // 列挙の終わりまでループ
 for(i=0; SetupDiEnumDeviceInfo( hDevInfo, i, &DeviceInfoData ); i++) // 1件取得
 {
  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_ADDRESS, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_BUSNUMBER, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_CAPABILITIES, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_CHARACTERISTICS, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_CLASS, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_CLASSGUID, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_COMPATIBLEIDS, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_CONFIGFLAGS, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_DEVICE_POWER_DATA, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_DEVTYPE, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_DRIVER, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_ENUMERATOR_NAME, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_EXCLUSIVE, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_FRIENDLYNAME, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_HARDWAREID, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_INSTALL_STATE, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_LEGACYBUSTYPE, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_LOCATION_INFORMATION, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_LOCATION_PATHS, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_LOWERFILTERS, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_MFG, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME, NULL, Buffer,sizeof
(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_SECURITY, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_SECURITY_SDS, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_SERVICE, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_UI_NUMBER_DESC_FORMAT, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

  SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_UPPERFILTERS, NULL, Buffer,sizeof(Buffer),&Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

// デバイスインスタンスIDを取得
  SetupDiGetDeviceInstanceId( hDevInfo, &DeviceInfoData, (PTSTR)Buffer, sizeof(Buffer), &Length );
  MessageBox( (const char*)Buffer , 0 , MB_OK );

// COMポート番号を取得
  HKEY tmp_key = SetupDiOpenDevRegKey( hDevInfo, &DeviceInfoData,  DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_QUERY_VALUE );
  if( tmp_key ){
   DWORD tmp_type = 0;
   DWORD tmp_size = sizeof( Buffer );
   RegQueryValueEx( tmp_key,  _T("PortName"), NULL, &tmp_type , reinterpret_cast(Buffer), &tmp_size );
   MessageBox( (const char*)Buffer , 0 , MB_OK );
  }
 }



nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0