Прошу слишком не пинать слабо знаком с 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, найдет его экземпляр
А вот то что перечисленно выше....
COM, OLE: c VBS на FreePascal (Lazarus)
Модератор: Модераторы
Прямого аналога нет, требуется создавать com объект и работать с этим самым объектом. Или же импортировать библиотеку типов и работать с импортированными интерфейсами.
Например для WMI запроса:
Например для 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;