はじめてのDataSnap Windowsサービスを 使 ってサーバーを 作 成 50 http://www.avsoft.jp 新 規 プロジェクトを 作 成 ウィザードを 使 って 新 規 プロジェクトを 作 成 する [ファイル 新 規 作 成 その 他...] メニューを 選 択 すると 下 の 画 面 が 表 示 される 左 のペインから DataSnap Server 右 のペインから DataSnap Server を 選 択 し OK ボタンを 押 す 51 http://www.avsoft.jp 1
プロジェクトの 種 類 を 選 択 DataSnapサーバーの 種 類 を 選 択 する 作 成 するアプリケーション タイプを 次 の3 種 類 から 選 択 VCLフォームアプリケーション コンソールアプリケーション (Windows)サービスアプリケーション ここでは サービスアプリケーション を 選 択 し 次 へ を 押 す ここがポイント! 52 http://www.avsoft.jp サーバーの 機 能 を 選 択 DataSnapサーバーに 追 加 する 機 能 を 選 択 する ( 通 信 )プロトコル 認 証 サーバーメソッドクラス フィルタ JavaScriptファイル モバイルコネクタ ここでは 標 準 設 定 のまま 次 へ を 押 す 53 http://www.avsoft.jp 2
ポート 番 号 の 指 定 クライアントからのリスニングを 行 うポート 番 号 を 指 定 する サーバー 機 能 の 選 択 で 選 択 した プロトコル の ポート 番 号 を 指 定 ここでは 標 準 設 定 のまま 次 へ を 押 す [ポートのテスト]ボタンを 押 すと 指 定 のポート が 使 用 可 能 かどうかを 確 認 できる 54 http://www.avsoft.jp サーバー メソッド クラスの 上 位 クラスを 指 定 サーバーメソッド クラスの 上 位 の 型 を 指 定 する TComponent TDataModule TDSServerModule ここでは TComponent を 選 択 し 完 了 を 押 す 55 http://www.avsoft.jp 3
サーバープログラムの 自 動 生 成 ウィザードで 次 の2つのユニットが 自 動 生 成 される [ServerContainerUnit1] unit ServerContainerUnit1; interface unit ServerMethodsUnit1; uses System.SysUtils, System.Classes, Vcl.SvcMgr, interface Datasnap.DSTCPServerTransport, Datasnap.DSServer, Datasnap.DSCommonServer, uses System.SysUtils, System.Classes, Datasnap.DSServer, Datasnap.DSAuth; Datasnap.DSAuth, IPPeerServer; type type {$METHODINFO ON} TServerContainer1 = class(tservice) TServerMethods1 = class(tcomponent) DSServer1: TDSServer; private DSTCPServerTransport1: TDSTCPServerTransport; { private 宣 言 } DSServerClass1: TDSServerClass; public procedure DSServerClass1GetClass(DSServerClass: TDSServerClass; { public 宣 言 } var PersistentClass: TPersistentClass); function EchoString(Value: string): string; procedure ServiceStart(Sender: TService; var Started: Boolean); function ReverseString(Value: string): string; private { private 宣 言 } {$METHODINFO OFF} protected function DoStop: Boolean; override; implementation function DoPause: Boolean; override; function DoContinue: Boolean; override; uses System.StrUtils; procedure DoInterrogate; override; public function TServerMethods1.EchoString(Value: string): string; function GetServiceController: TServiceController; override; Result := Value; : [ServerMethodsUnit1] : 56 http://www.avsoft.jp プロジェクトの 保 存 とビルド [ファイル すべて 保 存 ]を 実 行 する プロジェクトを DataSnapWinServiceApp.dpr と 言 う 名 前 で 保 存 する 他 はそのままの 名 前 で 保 存 する ビルド を 実 行 する DataSnapWinServiceApp.dpr 1 2 1 ServerContainerUnit1.pas 2 ServerMethodsUnit1.pas 57 http://www.avsoft.jp 4
はじめてのDataSnap 生 成 されたユニットを 見 てみる 58 http://www.avsoft.jp サーバー コンテナ ユニットを 見 てみる (1/4) ウィザードで 自 動 生 成 される ServerContainerUnit1 には 3つ*1 のコンポーネントが 配 置 されている TDSServer: すべてのDataSnapコンポーネントを 結 びつけるための メインのサーバー 設 定 コンポーネント 必 ず 配 置 される TDSServerClass: 公 開 するクラスごとに 必 要 なコンポーネント publicなインターフェイスを 持 つクラスを 参 照 する TDSTCPServerTransport: 転 送 プロトコルと 使 用 するTCP/IP 等 の 設 定 を 定 義 する コンポーネント *1 サーバー 機 能 の 選 択 でチェックした 内 容 によって 配 置 されるコンポーネントが 異 なる 59 http://www.avsoft.jp 5
サーバー コンテナ ユニットを 見 てみる (2/4) unit ServerContainerUnit1; interface uses System.SysUtils, System.Classes, Vcl.SvcMgr, Datasnap.DSTCPServerTransport, Datasnap.DSServer, Datasnap.DSCommonServer, Datasnap.DSAuth, IPPeerServer; TServiceから 派 生 type TServerContainer1 = class(tservice) DSServer1: TDSServer; DSTCPServerTransport1: TDSTCPServerTransport; DSServerClass1: TDSServerClass; procedure DSServerClass1GetClass(DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass); procedure ServiceStart(Sender: TService; var Started: Boolean); private { private 宣 言 } protected function DoStop: Boolean; override; function DoPause: Boolean; override; function DoContinue: Boolean; override; procedure DoInterrogate; override; public function GetServiceController: TServiceController; override; 自 動 追 加 されている var ServerContainer1: TServerContainer1; implementation uses Winapi.Windows, ServerMethodsUnit1; {$R *.dfm} 60 http://www.avsoft.jp サーバー コンテナ ユニットを 見 てみる (3/4) procedure TServerContainer1.DSServerClass1GetClass( DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass); PersistentClass := ServerMethodsUnit1.TServerMethods1; procedure TServerContainer1.ServiceStart(Sender: TService; var Started: Boolean); DSServer1.Start; function TServerContainer1.GetServiceController: TServiceController; Result := ServiceController; procedure ServiceController(CtrlCode: DWord); stdcall; ServerContainer1.Controller(CtrlCode); End; procedure TServerContainer1.DoInterrogate; inherited; function TServerContainer1.DoStop: Boolean; DSServer1.Stop; Result := inherited; function TServerContainer1.DoPause: Boolean; DSServer1.Stop; Result := inherited; function TServerContainer1.DoContinue: Boolean; Result := inherited; DSServer1.Start; end. 61 http://www.avsoft.jp 6
サーバー コンテナ ユニットを 見 てみる (4/4) ウィザードで 自 動 生 成 される ServerContainerUnit1.pas には サービス アプレット 内 の 操 作 ( 赤 枠 )で 呼 び 出 される4つのメソッドが 生 成 される DoInterrogate: 開 始 ボタンが 押 されたときに 呼 び 出 される DoStop : 停 止 ボタンが 押 されたときに 呼 び 出 される DoPause: 一 時 停 止 ボタンが 押 されたときに 呼 び 出 される DoContinue: 再 開 ボタンが 押 されたときに 呼 び 出 される 62 http://www.avsoft.jp サーバー メソッド ユニットを 見 てみる ServerMethodsUnit1には サーバー クラスとサーバーメソッドが 自 動 的 に 追 加 されている unit ServerMethodsUnit1; interface uses System.SysUtils, System.Classes, Datasnap.DSServer, Datasnap.DSAuth; Server Class type {$METHODINFO ON} TServerMethods1 = class(tcomponent) private { private 宣 言 } [サンプル メソッド] にチェックを 付 けると... public { public 宣 言 } function EchoString(Value: string): string; function ReverseString(Value: string): string; {$METHODINFO OFF} implementation uses System.StrUtils; function TServerMethods1.EchoString(Value: string): string; Result := Value; function TServerMethods1.ReverseString(Value: string): string; Result := System.StrUtils.ReverseString(Value); end. 63 http://www.avsoft.jp 7
サーバー メソッドの 追 加 サーバー クラス(TServerMethods1.pas)に クライアントから 呼 び 出 されるメソッドを 追 加 する unit ServerMethodsUnit1; {$METHODINFO ON} TServerMethods1 = class(tcomponent) : function EchoString(Value: string): string; function ReverseString(Value: string): string; function Add(a, b: Double): Double; function Dic(a, b: Double): Double; function Mult(a, b: Double): Double; function Sub(a, b: Double): Double; {$METHODINFO OFF} 追 加! function TServerMethods1.Add(a, b: Double): Double; Result := a + b; function TServerMethods1.Dic(a, b: Double): Double; Result := a / b; function TServerMethods1.Mult(a, b: Double): Double; Result := a * b; function TServerMethods1.Sub(a, b: Double): Double; Result := a - b; 64 http://www.avsoft.jp サービスのインストール インストールは 次 の 手 順 で 行 う 管 理 者 権 限 で コマンド プロンプト を 起 動 する コマンドラインから 次 の 通 り 入 力 し [Enter]キーを 押 す [パス 名 ] [DataSnapサーバ 名 ] /INSTALL 65 http://www.avsoft.jp 8
サービスの 登 録 確 認 と 起 動 サービスが 正 しく 登 録 されたかは 次 の 手 順 で 確 認 することができる コントロールパネルを 開 き [ 管 理 ツール][サービス]をクリックして サービス を 起 動 する サービス 名 (ServerContainer1)が 登 録 されているか 確 認 状 態 が 開 始 となっていない 場 合 は サービス 名 をダブルクリックし プロパティ 画 面 から[ 開 始 ]ボタンを 押 す 66 http://www.avsoft.jp サービスの 削 除 登 録 されたサービスは 次 の 手 順 で 削 除 することができる 管 理 者 権 限 で コマンド プロンプト を 起 動 する コマンドラインから 次 の 通 り 入 力 し [Enter]キーを 押 す sc.exe DELETE [サービス 名 ] 67 http://www.avsoft.jp 9