WindowsでCOM Portデバイスを使うとき抜き差ししながらデバイスマネージャでCOMポート番号を調べていたが、もっと簡単に調べることができないのかなと思って探しているときに山本ワールドさんという方が作られたCOM Port列挙プログラムを見つけてしまった。
ちょっと興味があったのでVC++で作られたコードをEclipse+MinGW用に修正しデバイスのハードウェアID(VID/PID)も表示できるようにしてみた。
USB-Serial/FTDI/Bluetoothなどもわかるので便利かも。
※GUI版も作ってみた。USBの抜き差しによりウインドウが開き抜き差しされたUSBデバイスがわかる。スタートアップ登録して使っているがUSB接続状態が一目でわかり非常に便利だ。
Windows の COM Port を列挙する (GUI版)
【Dwonload (Eclipse Project)】
comlist.zip
【プログラム】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
/* comlist.cpp - Windows COM Port Enumeration Utility (MinGW) Copyright (c) 2022 Sasapea's Lab. All right reserved. Reference from: http://yamatyuu.net/computer/program/comlist/index.html This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <windows.h> #include <setupapi.h> // Requires a link for setupapi.dll (-lsetupapi) #include <stdio.h> #include <tchar.h> #if 0 // MinGW error!! #include <winioctl.h> #else const GUID GUID_DEVINTERFACE_COMPORT = { 0x86e0d1e0, 0x8089, 0x11d0, 0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73 }; #endif int comList(void) { int count = 0; HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_COMPORT, 0, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (hDevInfo) { SP_DEVINFO_DATA data = { sizeof(data) }; while (SetupDiEnumDeviceInfo(hDevInfo, count++, &data)) { HKEY key = SetupDiOpenDevRegKey(hDevInfo, &data, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_QUERY_VALUE); if (key) { TCHAR name[256]; DWORD size = sizeof(name); RegQueryValueEx(key, TEXT("PortName"), NULL, NULL, (LPBYTE)name, &size); _tprintf(TEXT("%s"), name); if (SetupDiGetDeviceRegistryProperty(hDevInfo, &data, SPDRP_DEVICEDESC, NULL, (LPBYTE)name, sizeof(name), NULL)) _tprintf(TEXT(", %s"), name); else _tprintf(TEXT(", -")); if (SetupDiGetDeviceRegistryProperty(hDevInfo, &data, SPDRP_HARDWAREID, NULL, (LPBYTE)name, sizeof(name), NULL)) _tprintf(TEXT(", %s\n"), name); else _tprintf(TEXT("\n")); } } SetupDiDestroyDeviceInfoList(hDevInfo); } return count; } int main(void) { return comList(); } |