COM, OLE: c VBS на FreePascal (Lazarus)

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
SergK
новенький
Сообщения: 21
Зарегистрирован: 05.03.2011 17:24:51

COM, OLE: c VBS на FreePascal (Lazarus)

Сообщение SergK »

Прошу слишком не пинать слабо знаком с COM, OLE:

Есть строчки программы на VBS:
Set objExcel = CreateObject("Excel.Application")
или
Set adoCommand = CreateObject("ADODB.Command")
или
Set adoConnection = CreateObject("ADODB.Connection")

Если это переписать на FreePascal (Lazarus)
будет
objExcel := CreateOleObject('Excel.Application');
adoCommand := CreateOleObject('ADODB.Command');
adoConnection := CreateOleObject('ADODB.Connection');

А вот как перевести c VBS на FreePascal (Lazarus)
Стоки
Set objUser = GetObject("LDAP://" & сUserPath )
Set obj = GetObject("WinNT://" & ..... )
Set obj = GetObject("WinMgmts:") ?

GetActiveOleObject Явно не подходит.....
Вот если objExcel := GetActiveOleObject('Excel.Application',....);
то ПРИ ЗАПУЩЕННОМ Excel, найдет его экземпляр
А вот то что перечисленно выше....
CynicRus
постоялец
Сообщения: 106
Зарегистрирован: 28.06.2012 14:31:11

Сообщение CynicRus »

Прямого аналога нет, требуется создавать com объект и работать с этим самым объектом. Или же импортировать библиотеку типов и работать с импортированными интерфейсами.

Например для WMI запроса:

Код: Выделить всё

const
  FlagForwardOnly = $00000020;
  WMIClass = 'Win32_PhysicalMedia';
  WMIProperty = 'SerialNumber';
var
  SWbemLocator, WMIService: Variant;
  WbemObjectSet, WbemObject: Variant;
  EnumVarinat: IEnumvariant;
  SQL: WideString;
begin
  Result := False;
  SWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  WMIService := SWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
  SQL := WideString(Format('SELECT %s FROM %s', [WMIProperty, WMIClass]));
  try
    WbemObjectSet := WMIService.ExecQuery(SQL, 'WQL', FlagForwardOnly);
    EnumVarinat := IUnknown(WbemObjectSet._NewEnum) as IEnumVariant;
    if EnumVarinat.Next(1, WbemObject, nil) = 0 then
    begin
      if not VarIsNull(WbemObject.Properties_.Item(WMIProperty).Value) then
        ASerial := WbemObject.Properties_.Item(WMIProperty).Value;
    end;
    WbemObject := Unassigned;
    Result:= True;
  except
    on E: Exception do
      ShowMessage('Cannot get serial number: ' + sLineBreak + E.Message);
  end;
end;
Ответить