Работа с COM-объектами в Fore

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

Для создания экземпляра COM-объекта необходимо вызвать метод CreateObject с указанием программного идентификатора приложения. Если приложение уже запущено, то доступ к нему можно получить, используя метод GetActiveObject:

Var
    NewInstance, ExistInstance: Variant;
Begin
    NewInstance := Variant.CreateObject(<ProgID>);
    ExistInstance := Variant.GetActiveObject(<ProgID>);

Примечание. Программный идентификатор приложения может быть получен из реестра операционной системы, более подробно читайте в описании методов CreateObject, GetActiveObject.

Взаимодействие с полученным экземпляром приложения осуществляется посредством методов GetProperty, GetPropertyEx, SetProperty, SetPropertyEx, Invoke. Для работы с полученным экземпляром COM-объекта необходимо предварительно изучить его API.

Работа с COM-объектами на форме

В настольном приложении для работы с COM-объектами на прикладной форме в среде разработки предназначен компонент OleDocumentBox. Метод компонента CreateObject позволяет создать новый экземпляр COM-объекта, а метод CreateFromFile создаёт COM-объект в соответствии с типом указываемого файла, после чего загружает указанный файл.

Примечание. В «Форсайт. Аналитическая платформа» метод CreateFromFile поддерживается только для файлов Microsoft Excel и Microsoft Word.

Далее, используя свойство OleObject, можно работать с созданным экземпляром с помощью указанных выше методов типа данных Variant:

Var
    Obj: Variant;
Begin
    OleDocumentBox1.CreateObject(<ProgID>);
    Obj := OleDocumentBox1.OleObject;

Примеры взаимодействия с различными приложениями

В следующих подразделах приведены примеры взаимодействия с наиболее распространенными приложениями, а также варианты решения различных задач при работе с приложениями из Fore:

Примеры взаимодействия с приложениями

Общие рекомендации по работе с COM-объектами из Fore

Если свойства/методы COM-объекта в исходном API используют какие-либо перечислимые типы, то для использования их из Fore необходимо будет указывать числовые значения, которые соответствуют соответствующим элементам перечислений. Для того чтобы формируемый на Fore код был читаемым и не был перегружен сплошными числами, рекомендуется объявить аналогичные перечисления и использовать их при задании/проверке значений свойств или выполнении методов.

Пример:

Имеется какой-либо COM-объект, для которого реализован метод «Run» со следующей сигнатурой:

Function Run(a: UserEnum1, b: UserEnum2): UserEnum3;

UserEnum1, UserEnum2, UserEnum3 - это перечислимые типы, объявленные в API COM-объекта. Для выполнения данного метода код на Fore может выглядеть следующим образом:

Sub UserProc;
Var
    v, Res: Variant;
Begin
    v := Variant.CreateObject(<ProgID>);
    Res := v.Invoke("Run"31);
    Select Case (Res As Integer)
        Case 1//...
        Case 2//...
    End Select;
End Sub UserProc;

Без дополнительных комментариев сложно определить чему соответствуют значения «1,2,3» и что будет в результате выполнения метода, поэтому модифицируем код, определив перечисления UserEnum1, UserEnum2, UserEnum3 в Fore. Значения элементов перечислений должны соответствовать значениям в исходном API COM-объекта:

Enum UserEnum1
    a, b, c
End Enum UserEnum1;
Enum UserEnum2
    a = 1, b = 2, c = 3
End Enum UserEnum2;
Enum UserEnum3
    a = 1, b = 2, c = 4
End Enum UserEnum3;

Sub UserProc;
Var
    v, Res: Variant;
Begin
    v := Variant.CreateObject(<ProgID>);
    Res := v.Invoke("Run", UserEnum2.c, UserEnum1.a);
    Select Case (Res As UserEnum3)
        Case UserEnum3.a: //...
        Case UserEnum3.b: //...
    End Select;
End Sub UserProc;

См. также:

Разработка прикладного приложения