Вопрос пользователя заключается в необходимости использовать 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