3

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;
4

1 に答える 1

4

...たとえば、必要なデバイスが COM ポート 3 にあることを既に抽出しており、それがモデムであることもわかっているとします。その COM ポートに関連付けられているモデムの名前を見つけるにはどうすればよいでしょうか。

AttachedToWMI クラスのプロパティを使用Win32_POTSModemして、モデムが接続されているポートを取得できます。

このサンプルを試す

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;


function  GetConnectedModem(const PortName : string):string;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin
  Result:='';
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery(Format('SELECT Name FROM Win32_POTSModem Where AttachedTo="%s"',[PortName]),'WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  if oEnum.Next(1, FWbemObject, iValue) = 0 then
  begin
    Result:=FWbemObject.Name;
    FWbemObject:=Unassigned;
  end;
end;


begin
 try
    CoInitialize(nil);
    try
      Writeln(GetConnectedModem('COM1'));
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;
end.
于 2012-08-29T01:59:56.707 に答える