На этом шаге мы рассмотрим, как преобразуется этот вызов на сервере. Если мы реализовали метод СОМ-сервера как процедуру, поддерживающую соглашение о вызовах safecall, Delphi скомпилирует его в функцию, возвращающую значение типа HRESULT и поддерживающую соглашение о вызовах stdcall. Если метод был функцией, то возвращаемое значение преобразуется в еще один параметр этого метода. Сама […]
Архив категории ‘Технология COM’
Обработка ошибок. Соглашение о вызовах 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, создать модуль с формой и поместить на нее необходимые элементы управления вместе с обработчиками событий. Далее следует […]