Delphi - сбориник статей

Сервер


Сервер будем реализовывать как standalone Web Service(Требуется библиотека Indy).

  1. Создаем консольное приложение.
  2. Добавляем к нему TDataModule.
  3. Объявляем интерфейс(Классом реализации будет наш дата-модуль):
    1: { Invokable interface IWSSTest } 2: 3: unit WSSTestIntf; 4: 5: interface 6: 7: uses InvokeRegistry, Types, XSBuiltIns; 8: 9: type 10: 11: { Invokable interfaces must derive from IInvokable } 12: IWSSTest = interface(IInvokable) 13: ['{15907745-68B1-47A3-86A6-9EF2A3530493}'] 14: 15: { Methods of Invokable interface must not use the default } 16: { calling convention; stdcall is recommended } 17: function TestMethod(const s : string): string ;stdcall; 18: end; 19: 20: implementation 21: 22: initialization 23: { Invokable interfaces must be registered } 24: InvRegistry.RegisterInterface(TypeInfo(IWSSTest)); 25: 26: end.
  4. Реализуем поддержку нашего интерфейса в дата-модуле:
    1: unit Unit2; 2: 3: interface 4: 5: uses 6: SysUtils, Classes, WSSTestIntf, 7: WSObj{WSS Core}; 8: 9: type 10: TDataModule2 = class(TDataModule, IWSSTest, IWSSessionNotifyEvents) 11: private 12: { Private declarations } 13: //добавление совершенно не обязательно, но удобно, а иногда и полезно:) 14: procedure WSSessionNotifyEvent(const SessionClient : TWSSesClient; 15: const EventName : string; 16: const Data: OleVariant); 17: public 18: { Public declarations } 19: function TestMethod(const s : string): string ;stdcall; 20: end; 21: 22: var 23: DataModule2: TDataModule2; 24: 25: implementation 26: 27: {$R *.dfm} 28: 29: { TDataModule2 } 30: 31: function TDataModule2.TestMethod(const s: string): string; 32: begin 33: Result := 'Hello from server: '+ s; 34: writeln('Method call: '+ s); 35: end; 36: 37: procedure TDataModule2.WSSessionNotifyEvent( 38: const SessionClient: TWSSesClient; const EventName: string; 39: const Data: OleVariant); 40: begin 41: writeln('EVENT:',EventName,' - sessionid:',SessionClient.SessionID); 42: end; 43: 44: end.
  5. Модифицируем dpr-файл как показано ниже.
    1: program Project2; 2: 3: {$APPTYPE CONSOLE} 4: 5: uses 6: SysUtils, 7: IndyHttpServerApp,{Под Apache2 заменить на Apache2ServerApp} 8: WSSTestIntf in 'WSSTestIntf.pas', 9: Unit2 in 'Unit2.pas' {DataModule2: TDataModule}; 10: 11: begin 12: { TODO -oUser -cConsole Main : Insert code here } 13: ServerApplication.Initialize; 14: {register TDataModule2 class for AppID="TEST"} 15: ServerApplication.RegisterDataModuleClass(TDataModule2,'TEST'); 16: ServerApplication.Run; 17: end.
  6. Готово. Запускаем сервер.
  7. Видим Service Info Page страницу по адресу: http://localhost:8888/


Содержание раздела