«Машины должны работать. Люди должны думать»
51. Разработка клиентских приложений
Разработка клиентского приложения. Создать новое ("обычное") приложение, добавить в него созданный ранее модуль библиотеки типов (в нашем примере это SimpleCOM_TLB.pas). Это приложение будет выполнять роль клиентского приложения, использующего разработанный выше сервер. В предложение uses модуля проекта-клиента необходимо добавить модуль библиотеки типов (SimpleCOM_TLB.pas).
В класс формы добавить интерфейсы, например, следующим образом:
type
TMainForm = class(TForm)
…
public
Interface1 : ISmpCOM;
Interface2 : ISmpCOM2;
end;
Добавить обработчик события OnFormShow:
procedure TMainForm.FormShow(Sender: TObject);
begin
Interface1:=CoSmpCOM.Create; {для первого интерфейса только}
Interface1.QueryInterface(ISmpCOM2,Interface2); {для второго и
всех других интерфейсов}
end;
Теперь в том месте, где вы сочтете нужным, можно вызывать (функциональные) методы СОМ объекта таким образом:
Interface1.Имя_Метода(фактические_параметры)
Теперь приложение можно компилировать и выполнять.
После создания COM объекта его необходимо зарегистрировать, чтобы другие приложения смогли найти и использовать его, а перед удалением – разрегистрировать.
Для регистрации объекта необходимо выполнить (в Delphi) команду меню Run|Register ActiveX Server, а для разрегистрации – команду Run|Unregister ActiveX Server. При выполнении этих команд вызываются процедуры DllRegisterServer и DllUnregisterServer, экспортируемые библиотекой DLL.
При создании экземпляра СОМ объекта целесообразно добавить код, проверяющий результат вызова конструктора сокласса, например, такой:
procedure TMainForm.FormShow(Sender: TObject);
begin
try
Interface1:=CoSmpCOM.Create;
except
MessageDlg(
'Не удается запустить сервер SimpleCOM.dll.'+
' Убедитесь в том, что сервер зарегистрирован с помощью команды' +
' RegSvr32 путь\SimpleCOM.dll',
mtError, [mbOk], 0);
Close;
end;
Interface1.QueryInterface(ISmpCOM2,Interface2);
end;
Отладка внутрипроцессных серверов. Для отладки серверов, выполненных в виде DLL библиотек, необходимо:
Ø открыть и откомпилировать проект сервера;
Ø установить в требуемом месте контрольную точку;
Ø в меню Delphi Run/Parameters на странице Local в окне Host Application указать имя exe-файла клиентского приложения и нажать кнопку ОК (не Load). Клиентское приложение должно быть откомпилировано и построено;
Ø начать отладку, выполнив команду Run, F7 или F8. Файл проекта клиентского приложения загружать не нужно.
Контрольную точку желательно установить в секции инициализации главного модуля библиотеки – на вызове метода TTypedComObjectFactory.Create (в случае использования библиотеки типов) или TTComObjectFactory.Create (без использования библиотеки типов). ( В Delphi 5 запуск отладки с помощью трассировки F7 или F8 почему-то не удается, а в Delphi 6 – да.)
При выполнении команды Run вначале будет запущено клиентское приложение (не в режиме отладки) и, когда его выполнение дойдет до точки вызова конструктора сокласса (Со_имя_СОМ_объекта.Create), состоится загрузка сервера, т.е. отлаживаемой библиотеки DLL, и будет выполнен останов в контрольной точке.
Для просмотра последовательности загрузки всех библиотек, в том числе системных, удобно использовать средство отладчика, запускаемое с помощью команды меню View/Debug Windows/Event Log. Вот пример содержимого этого окна с некоторыми сокращениями (для Windows 95):
Process Start: …\Client.exe. Base Address: $00400000. Process Client.exe ($FFF53AE5)
Module Load: Client.exe. No Debug Info.
Module Load: COMCTL32.dll. No Debug Info.
Module Load: ole32.dll. No Debug Info.
Module Load: OLEAUT32.dll. No Debug Info.
Module Load: ADVAPI32.dll. No Debug Info.Module Load: GDI32.dll. No Debug Info.
Module Load: USER32.dll. No Debug Info.
Module Load: KERNEL32.dll. No Debug Info.
Module Load: ShellHook.dll. No Debug Info.
Module Load: OLEPRO32.DLL. No Debug Info.
Module Load: SimpleCOM.dll. Has Debug Info.
Module Load: LvHook.dll. No Debug Info.
Module Unload: OLEPRO32.DLL.
Module Unload: SimpleCOM.dll.
Process Exit: …\Client.exe.
Module Unload: Client.exe.
Module Unload: COMCTL32.dll.
Module Unload: ole32.dll.
Module Unload: OLEAUT32.dll.
Module Unload: ADVAPI32.dll.
Module Unload: GDI32.dll.
Module Unload: USER32.dll.
Module Unload: KERNEL32.dll.
Module Unload: ShellHook.dll.
Module Unload: LvHook.dll.
«50. Последовательность создания простого COM объекта в Delphi»
52. Импорт библиотеки типов