Читать «Виртуальная библиотека Delphi» онлайн - страница 137

Unknown

Вы можете создать package — это тоже DLL, но с некоторыми особенностями.

Если вы создаете ActiveX, то у вас появится файл с расширением DLL, который вы можете при желании переименовать в ActiveX. Также у вас автоматически появится файл TLB — это библиотека типов (Type Library), необходимая для поддержки нестандартных типов данных. Кроме того, вы можете создать TLB файл отдельно.

3. Какую модель данных использует Delphi?

Delphi 2.0 использует так называемую плавающую модель памяти (FLOAT), которая принята в Win 32. Отличительной особенностью данной модели памяти является линейная 32-разрядная адресация всего адресного пространства, которое может иметь соответственно размер до 4 Гбайт. При этом все указатели, адреса процедур, указатели на VMT также адресуются через 32-разрядные регистры.

Object Pascal и Windows API

1. Каким образом реализована поддержка COM/DCOM?

В языке Object Pascal появилось понятие интерфейса (interface). Описание интерфейса похоже на описание обычного класса, в нем не может быть указан спецификатор видимости. Список членов ограничен методами и свойствами, для чтения/записи которых используются методы. Поля в интерфейсе недопустимы. Типы параметров и возвращаемых значений ограничены типами, допустимыми в COM/DCOM, их полный перечень можно найти в on-line help.

Интерфейсы могут наследоваться, в соответствии с идеологией COM, допускается только одиночное наследование. Класс может реализовывать несколько интерфейсов, в этом случае он должен объявить методы, которые по типу параметров и возвращаемых значений совпадают с описанием методов соответствующего интерфейса.

Все интерфейсы имеют в качестве базового класса интерфейсный тип IUnknown, объявленный в модуле System следующим образом:

IUnknown = interface

  ['{00000000-0000-0000-C000-000000000046}']

  function QueryInterface(const IID: TGUID; out Obj): Integer; stdcall;

  function _AddRef: Integer; stdcall;

  function _Release: Integer; stdcall;

end;

Для поддержки OLE Automation также в модуле System имеется интерфейс IDispatch:

IDispatch = interface(IUnknown)

  ['{00020400-0000-0000-C000-000000000046}']

  function GetTypeInfoCount(out Count: Integer): Integer; stdcall;

  function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): Integer; stdcall;

  function GetIDsOfNames(const IID: TGUID; Names: Pointer;

    NameCount, LocaleID: Integer; DispIDs: Pointer): Integer; stdcall;

  function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;

    Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): Integer; stdcall;

end;

Для облегчения работы с COM имеется класс TInterfacedObject, который реализует методы, объявленные в интерфейсе IUnknown.

2. В Delphi 3.0 допускается множественное наследование классов?

Нет, нет и еще 1024 раза нет. Язык Object Pascal в Delphi 3.0 не позволяет вам наследовать класс от более чем одного класса. Строго говоря, вы всегда наследуете ваш новый класс ровно от одного уже имеющегося. Если вы явно не указываете базовый класс, то им становится TObject, стоящий таким образом в иерархии вообще всех классов.