Основы COM. Рудалев В.Г - 8 стр.

UptoLike

8
Рассмотрим несколько примеров обращения к интерфейсам. Предположим, что
у созданного нами COM-объекта есть интерфейс ICalcSrv, содержащий ме-
тод Calculate.
Пример 1. Использование оператора as.
var
Srv: ICalcSrv;
begin
// Создаем COM объект и запрашиваем у него интерфейс.
// Константа Class_Calcsrv обозначает CLSID
// COM-объекта и описывается в библиотеке типов
Srv := CreateComObject (Сlass_Сalcsrv) as ICalcSrv;
// Вызываем метод Calculate интерфейса ICalcSrv
Srv.Calculate;
// Освобождаем интерфейс
Srv := Nil;
end;
Оператор as действует в данном фрагменте кода по такому же принципу , что и
при приведении типов объектов , но позволяет перейти к любому интерфейсу , а
не только к дочернему. Фактически компилятор встраивает здесь вызов метода
QueryInterface.
Пример 2. Явное использование метода QueryInterface.
var
Srv: ICalcSrv;
IU: IUnknown;
IU := CreateComObject (Class_Calcsrv);
// Константа IID_ICalcsrv обозначает IID интерфейса
if IU.QueryInterface(IID_ICalcsrv, Srv) <> S_OK then
ShowMessage('Интерфейс не найден')
else
Srv.Calculate;
Этот способ предпочтителен, когда точно не известно , имеется ли у объекта
требуемый интерфейс. Остальные способы при отсутствии интерфейса вызы-
вают исключительную ситуацию.
Пример 3. Использование компонентного класса .
var
Srv: ICalcSrv;
Srv := CoEditSrv.Create;
Srv.Calculate;
                                         8
Рассмотри м несколько при меров обращ ени яки нтерфей сам. Пред полож и м, что
у соз д анного нами COM-объекта есть и нтерфей сICalcSrv, сод ерж ащ и й ме-
тод Calculate.
При мер1. И спольз ов ани еоператора as.
var
  Srv: ICalcSrv;
begin
…
  // Создаем COM объект и запрашиваем у него интерфейс.
  // Константа Class_Calcsrv обозначает CLSID
  // COM-объекта и описывается в библиотеке типов
  Srv := CreateComObject (Сlass_Сalcsrv) as ICalcSrv;
  // Вызываем метод Calculate интерфейса ICalcSrv
  Srv.Calculate;
  // Освобождаем интерфейс
  Srv := Nil;
end;
О ператорas д ей ств уетв д анном фрагментекод а по такому ж епри нци пу, что и
при при в ед ени и ти пов объектов , но поз в оляетперей ти клю бому и нтерфей су, а
нетолько кд очернему. Ф акти чески компи ляторв страи в аетз д есь в ы з ов метод а
QueryInterface.
При мер2. Я в ноеи спольз ов ани еметод а QueryInterface.
var
  Srv: ICalcSrv;
  IU: IUnknown;
…
  IU := CreateComObject (Class_Calcsrv);
  // Константа IID_ICalcsrv обозначает IID интерфейса
  if IU.QueryInterface(IID_ICalcsrv, Srv) <> S_OK then
     ShowMessage('Интерфейс не найден')
  else
     Srv.Calculate;
Э тот способ пред почти телен, когд а точно не и з в естно, и меется ли у объекта
требуемы й и нтерфей с. О стальны е способы при отсутств и и и нтерфей са в ы з ы -
в аю ти склю чи тельную си туаци ю .
При мер3. И спольз ов ани екомпонентного класса.
var
  Srv: ICalcSrv;
…
  Srv := CoEditSrv.Create;
  Srv.Calculate;
…