WMI を使用して、既知の COM ポートに現在接続されているモデム (またはその他のデバイス) の名前を見つける方法が必要です。
たとえば、必要なデバイスが COM ポート 3 にあることを既に抽出しており、それがモデムであることもわかっているとします。その COM ポートに関連付けられているモデムの名前を見つけるにはどうすればよいでしょうか。
現在、Win32_PnPEntityを使用して、名前にモデムまたは COM を含む pnp デバイスのリストを抽出できるコードがありますが、残念なことに、COM デバイスを返すとモデム名がなく、モデム デバイスを抽出すると COM に関連付けられません。ポート (したがって、2 つのモデムが接続されている場合、どれが COM ポート 3 にあるのかわかりません)。Win32_SerialPort関数も見つけましたが、シリアル ポート経由でコンピューターに接続されているすべてのデバイスが返されるわけではありません。
const wbemFlagForwardOnly = $00000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
ts : String;
begin;
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', '');
//This WMI service checks for plug and play devices
FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PnPEntity','WQL',wbemFlagForwardOnly);
//This WMI service which I didn't use checks for serial ports and what is on them - currently not displaying sufficient information}
//FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_SerialPort','WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
if not VarIsNull(FWbemObject.name) then
begin
ts:= String(FWbemObject.name);
if pos('(COM',ts)<>0 then
pnpForm.listbox1.items.add(ts);
end;
FWbemObject:=Unassigned;
end;
end;