Архив категории ‘Технология COM’

Обработка ошибок. Соглашение о вызовах safecall на сервере

    На этом шаге мы рассмотрим, как преобразуется этот вызов на сервере.     Если мы реализовали метод СОМ-сервера как процедуру, поддерживающую соглашение о вызовах safecall, Delphi скомпилирует его в функцию, возвращающую значение типа HRESULT и поддерживающую соглашение о вызовах stdcall. Если метод был функцией, то возвращаемое значение преобразуется в еще один параметр этого метода. Сама […]

Обработка ошибок. Соглашение о вызовах safecall на клиенте

    На этом шаге мы рассмотрим, как преобразуется этот вызов на клиенте.     Если при импорте библиотеки типов сгенерированы методы, поддерживающие соглашение о вызовах safecall, то их вызов преобразуется в следующий псевдокод: var HR: HRESULT; begin HR := StdCallImplementationOfFunction(Param1, Param2 ...); if not Succeed(HR) then begin // Получение от сервере информации об ошибке raise EOleError.Create(...); […]

Создание внутрипроцессных серверов автоматизации. Обработка ошибок (общие сведения)

    На этом шаге мы приведем общие сведения об обработке ошибок.     Соглашения о вызовах были рассмотрены на 302 шаге и там же было сказано, что в СОМ-интерфейсах используют соглашения stdcall и safecall. Однако из приведенной там таблицы 1 нельзя понять разницу между этими соглашениями - оба они помещают параметры в стек справа налево, и […]

Создание внутрипроцессных серверов автоматизации. Внутрипроцессный сервер автоматизации (общие сведения)

    На этом шаге мы рассмотрим основные шаги, выполняемые для создания такого сервера.     Как мы уже говорили в пердыдущих шагах, нередко сервер автоматизации создается в виде DLL. Главное отличие такого сервера автоматизации заключается в том, что все объекты, содержащиеся в DLL, находятся в адресном пространстве приложения, которое к ним обращается. Поэтому сервер автоматизации, расположенный […]

Создание и использование DLL. Экспорт дочерних форм из DLL

    На этом шаге мы рассмотрим экспортирование дочерних форм из DLL.     Дочерние формы (формы, которые в качестве родителей имеют другие формы, а не экран компьютера) достаточно распространены в приложениях. В принципе, такие формы могут поставляться и в DLL. При этом используется статическая загрузка DLL. Динамическая загрузка DLL возможна только в том случае, если библиотека […]

Создание и использование DLL. Немодальные формы в DLL (окончание)

    На этом шаге мы рассмотрим еще один способ загрузки немодальных форм из динамически подключаемых библиотек.     Код, приведенный на предыдущем шаге, получается довольно громоздким: в главном приложении необходимо реализовывать три функции вместо одной. Альтернативный вариант можно предложить, исходя из того, что в DLL имеется объект TApplication, который может поддерживать цикл выборки сообщений. Но в […]

Создание и использование DLL. Немодальные формы в DLL (продолжение)

    На этом шаге мы рассмотрим загрузку немодальных форм из динамически подключаемых библиотек.     Однако иногда возникает необходимость отображения немодальных форм из динамически загружаемых библиотек - например, при редком использовании в приложении немодальных форм для экономии ресурсов. Если реализовать код таким же образом, как и при показе модальных диалоговых окон, то форма будет создана и, […]

Создание и использование DLL. Немодальные формы в DLL

    На этом шаге мы рассмотрим отображение немодальных форм при статической загрузке DLL.     Отображение немодальных форм традиционно осуществляется со статической загрузкой DLL. Типичный код для отображения немодальной формы в DLL выглядит следующим образом: procedure ShowNonModalForm(AppHandle: THandle); stdcall; begin Application.Handle:=AppHandle; with TForm2.Create(Application) do Show; end;     Так же как и при отображении модальных форм, необходимо […]

Создание и использование DLL. Модальные формы в DLL (динамическое подключение)

    На этом шаге мы рассмотрим особенности использования модальных форм при динамическом подключении DLL.     Если загружать DLL динамически, возникает ряд проблем. Первая из них заключается в том, что, как правило, загрузка и выгрузка библиотеки, из которой вызывается диалоговое окно, осуществляется в пределах одной функции: HLib := LoadLibrary('FirstLib.dll'): if HLib <> 0 then begin ExecDialog:=GetProcAddress(HLib, […]

Создание и использование DLL. Модальные формы в DLL (статическое подключение)

    На этом шаге мы рассмотрим особенности использования модальных форм, расположенных в DLL, при статическом подключении.     В DLL можно не только выполнять вычисления, но и показывать формы, например диалоговые окна. Для этого следует открыть проект реализации DLL, создать модуль с формой и поместить на нее необходимые элементы управления вместе с обработчиками событий. Далее следует […]