Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Работа с WMI для идентификации модема по номеру COM-порта в Delphi

Delphi , Файловая система , Порты

Вопрос пользователя заключается в необходимости использовать WMI для получения имени модема (или другого устройства), подключенного к известному COM-порту. Пример: если известно, что устройство находится на COM-порту 3 и является модемом, то нужно найти имя этого модема, связанного с этим COM-портом.

Пользователь уже имеет код, который использует класс Win32_PnPEntity для получения списка устройств PnP с названиями, содержащими "modem" или "COM", но сталкивается с проблемой: устройства не содержат имен модемов, а модемы не связаны с конкретными COM-портами. Также был найден класс Win32_SerialPort, но он не возвращает всю информацию о подключенных устройствах.

Решение проблемы

Для решения задачи можно использовать класс Win32_POTSModem и его свойство AttachedTo, которое указывает на порт, к которому подключен модем. Ниже представлен пример кода на Object Pascal, который демонстрирует, как получить имя модема по номеру COM-порта:

{$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.

Этот код инициализирует соединение с WMI-сервисом, выполняет запрос для получения имени модема, подключенного к указанному порту, и выводит результат.

Комментарии

Стоит отметить, что данный метод может работать только для модемов или существует универсальный метод для всех устройств? В связи с особенностями работы COM-портов, универсального метода для определения устройств, подключенных к определенному порту, может не существовать. Тем не менее, для модемов можно использовать свойство AttachedTo класса Win32_POTSModem.


Этот пример демонстрирует, как с помощью WMI и Delphi можно получить информацию о модемах, подключенных к COM-портам, что может быть полезно для разработчиков, работающих с устройствами связи и использующих Delphi для создания соответствующего программного обеспечения.

Создано по материалам из источника по ссылке.

Использование WMI для идентификации модема по номеру COM-порта в программе на Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Порты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 17:13:20/0.013901948928833/1