IPC.pas
上传用户:psxgmh
上传日期:2013-04-08
资源大小:15112k
文件大小:9k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit IPC;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
  5. const
  6.   {定义消息常量}
  7.   IPCServerDisconnecting = 'IPCServerDisconnecting';
  8.   IPCClientDisconnecting = 'IPCClientDisconnecting';
  9.   IPCConnectRequest = 'IPCConnectRequest';
  10.   IPCConnectRespose = 'IPCConnectRespose';
  11. type
  12.   {定义事件类型}
  13.   TOnData = procedure(MsgPointer: Pointer) of object; //数据事件
  14.   TOnClientData = procedure(MsgPointer: Pointer; AHwnd: HWND) of object; //当客户端接收数据事件
  15.   TOnConnect = procedure(AHwnd: HWND) of object; //连接事件
  16.   TOnDisconnect = procedure(AHwnd: HWND) of object; //断开事件
  17.   {定义TIPCServer服务器类}
  18.   TIPCServer = class(TComponent)
  19.   private
  20.     FWinHwnd: HWND; //窗体句柄
  21.     FOnClientData: TOnClientData; //当接收到客户端数据时
  22.     FOnConnect: TOnConnect; //当连接
  23.     FOnDisconnect: TOnDisconnect; //当断开
  24.     FActive: Boolean; //是否激活
  25.     FSessionName: string; //连接会话的名字
  26.     FSessionHandle: Longint; //连接会话的消息标识符
  27.     FServerDisconnectHwnd: Longword; //IPCServerDisconnecting消息标识符
  28.     FConnectRequestHwnd: Longword; //IPCConnectRequest消息标识符
  29.     FConnectResposeHwnd: Longword; //IPCConnectRespose消息标识符
  30.     FClientDisconnectHwnd: Longword; //IPCClientDisconnecting消息标识符
  31.     FOnAfterClose: TNotifyEvent; //打开事件
  32.     FOnAfterOpen: TNotifyEvent; //关闭事件
  33.   protected
  34.     procedure WndProc(var AMsg: TMessage);
  35.   public
  36.     constructor Create(AOwner: TComponent); override;
  37.     destructor Destroy; override;
  38.     procedure SendMsg(MsgPointer: Pointer; AWinHwnd: HWND; ASize: DWORD);
  39.     procedure Open;
  40.     procedure Close;
  41.   published
  42.     property Active: Boolean read FActive default False;
  43.     property OnClientData: TOnClientData read FOnClientData write FOnClientData;
  44.     property OnConnect: TOnConnect read FOnConnect write FOnConnect;
  45.     property OnDisconnect: TOnDisconnect read FOnDisconnect write FOnDisconnect;
  46.     property OnAfterClose: TNotifyEvent read FOnAfterClose write FOnAfterClose;
  47.     property OnAfterOpen: TNotifyEvent read FOnAfterOpen write FOnAfterOpen;
  48.     property SessionName: string read FSessionName write FSessionName;
  49.   end;
  50.   {定义客户端TIPCClient}
  51.   TIPCClient = class(TComponent)
  52.   private
  53.     FWinHwnd: HWND; //窗体句柄
  54.     FServerWinHwnd: HWND; //窗体句柄
  55.     FOnData: TOnData; //当客户端接受数据
  56.     FOnConnect: TOnConnect; //当客户端连接
  57.     FOnDisconnect: TOnDisconnect; //当客户端断开连接
  58.     FActive: Boolean; //是否激活
  59.     FSessionName: string; // 连接会话的名字
  60.     FSessionHandle: Longint; //连接会话的消息标识符
  61.     FServerDisconnectHwnd: Longword; //IPCServerDisconnecting消息标识符
  62.     FConnectRequestHwnd: Longword; //IPCConnectRequest消息标识符
  63.     FConnectResposeHwnd: Longword; //IPCConnectRespose消息标识符
  64.     FClientDisconnectHwnd: Longword; //IPCClientDisconnecting消息标识符
  65.   protected
  66.     procedure WndProc(var AMsg: TMessage);
  67.   public
  68.     constructor Create(AOwner: TComponent); override;
  69.     destructor Destroy; override;
  70.     procedure SendMsg(MsgPointer: Pointer; ASize: DWORD);
  71.     procedure Open;
  72.     procedure Close;
  73.   published
  74.     property Active: Boolean read FActive default False;
  75.     property OnData: TOnData read FOnData write FOnData;
  76.     property OnConnect: TOnConnect read FOnConnect write FOnConnect;
  77.     property OnDisconnect: TOnDisconnect read FOnDisconnect write FOnDisconnect;
  78.     property SessionName: string read FSessionName write FSessionName;
  79.   end;
  80. implementation
  81. //TIPCServer实现
  82. constructor TIPCServer.Create(AOwner: TComponent);
  83. begin
  84.   inherited Create(AOwner);
  85.   FWinHwnd := 0;
  86.   FSessionHandle := 0;
  87.   //注册消息常量
  88.   FServerDisconnectHwnd := RegisterWindowMessage(IPCServerDisconnecting);
  89.   FConnectRequestHwnd := RegisterWindowMessage(IPCConnectRequest);
  90.   FConnectResposeHwnd := RegisterWindowMessage(IPCConnectRespose);
  91.   FClientDisConnectHwnd := RegisterWindowMessage(IPCClientDisconnecting);
  92. end;
  93. destructor TIPCServer.Destroy;
  94. begin
  95.   if FWinHwnd <> 0 then
  96.   begin
  97.     //广播服务器断开消息
  98.     SendMessage(HWND_BROADCAST, FServerDisconnectHwnd, FWinHwnd, 0);
  99.     DeallocateHWND(FWinHwnd);
  100.   end;
  101.   inherited Destroy;
  102. end;
  103. procedure TIPCServer.Open;
  104. begin
  105.   if not FActive then
  106.   begin
  107.     //注册连接会话的消息标识符
  108.     FSessionHandle := RegisterWindowMessage(PChar(FSessionName));
  109.     //创建新窗体,窗体过程执行WndProc;
  110.     FWinHwnd := AllocateHWND(WndProc);
  111.     if FWinHwnd <> 0 then
  112.     begin
  113.       FActive := True;
  114.       if Assigned(FOnAfterOpen) then
  115.         FOnAfterOpen(Self);
  116.     end
  117.     else
  118.       raise Exception.Create('Cannot Allocate Window Handle');
  119.   end;
  120. end;
  121. procedure TIPCServer.Close;
  122. begin
  123.   if FActive then
  124.   begin
  125.     if FWinHwnd <> 0 then
  126.     begin
  127.       //广播服务器断开的消息
  128.       SendMessage(HWND_BROADCAST, FServerDisconnectHwnd, FWinHwnd, FSessionHandle);
  129.       //释放由AllocateHWND创建的窗体
  130.       DeallocateHWND(FWinHwnd);
  131.       FWinHwnd := 0;
  132.       FActive := False;
  133.       if Assigned(FOnAfterClose) then
  134.         FOnAfterClose(Self);
  135.     end;
  136.   end;
  137. end;
  138. //重载消息处理过程
  139. procedure TIPCServer.WndProc(var AMsg: TMessage);
  140. var
  141.   MsgPointer: Pointer;
  142.   ClientHwnd: HWND;
  143. begin
  144.   //根据消息种类,分别处理
  145.   if ((AMsg.Msg = WM_COPYDATA) and (AMsg.wParam = FSessionHandle)) then
  146.   begin
  147.   //如果是WM_CopyData消息
  148.     MsgPointer := (TCopyDataStruct(Pointer(AMsg.lParam)^)).lpData;
  149.     ClientHwnd := (TCopyDataStruct(Pointer(AMsg.lParam)^)).dwData;
  150.     if Assigned(FOnClientData) then
  151.       FOnClientData(MsgPointer, ClientHwnd);
  152.   end
  153.   else if ((AMsg.Msg = FConnectRequestHwnd) and (AMsg.lParam = FSessionHandle)) then
  154.   begin
  155.   //如果是客户端连接请求消息时
  156.     if FActive then
  157.     begin
  158.       //得到客户端窗口句柄
  159.       ClientHwnd := AMsg.wParam;
  160.       if ClientHwnd <> 0 then
  161.       begin
  162.         SendMessage(ClientHwnd, FConnectResposeHwnd, FWinHwnd, 0);
  163.         if Assigned(FOnConnect) then
  164.           FOnConnect(ClientHwnd);
  165.       end;
  166.     end;
  167.   end
  168.   else if ((AMsg.Msg = FClientDisconnectHwnd) and (AMsg.lparam = FSessionHandle)) then
  169.   begin
  170.     //如果是客户端断开连接时
  171.     ClientHwnd := Amsg.WParam;
  172.     SendMessage(ClientHwnd, FServerDisconnectHwnd, FwinHwnd, 0);
  173.     if Assigned(FOnDisConnect) then
  174.       FOnDisConnect(clientHwnd);
  175.   end;
  176. end;
  177. procedure TIPCServer.SendMsg(MsgPointer: Pointer; AWinHwnd: HWND; ASize: DWORD);
  178. var
  179.   CopyDataStruct: TCopyDataStruct;
  180. begin
  181.   CopyDataStruct.dwData := 0;
  182.   CopyDataStruct.cbData := ASize;
  183.   CopyDataStruct.lpData := MsgPointer;
  184.   SendMessage(AWinHwnd, WM_COPYDATA, FSessionHandle, lParam(@CopyDataStruct));
  185. end;
  186. //TIPCClient实现
  187. constructor TIPCClient.Create(AOwner: TComponent);
  188. begin
  189.   inherited Create(AOwner);
  190.   FWinHwnd := 0;
  191.   FServerWinHwnd := 0;
  192.   FSessionHandle := 0;
  193.   //注册消息常量
  194.   FServerDisconnectHwnd := RegisterWindowMessage(IPCServerDisconnecting);
  195.   FConnectRequestHwnd := RegisterWindowMessage(IPCConnectRequest);
  196.   FConnectResposeHwnd := RegisterWindowMessage(IPCConnectRespose);
  197.   FClientDisconnectHwnd := RegisterWindowMessage(IPCClientDisconnecting);
  198. end;
  199. destructor TIPCClient.Destroy;
  200. begin
  201.   if FWinHwnd <> 0 then
  202.   //释放由AllocateHWND创建的窗体
  203.     DeallocateHWND(FWinHwnd);
  204.   inherited Destroy;
  205. end;
  206. procedure TIPCClient.Open;
  207. begin
  208.   if not FActive then
  209.   begin
  210.     //注册连接会话的消息标识符
  211.     FSessionHandle := RegisterWindowMessage(PChar(FSessionName));
  212.    //创建新窗体,窗体过程执行WndProc;
  213.     FWinHwnd := AllocateHWND(WndProc);
  214.     if FWinHwnd <> 0 then
  215.       SendMessage(HWND_BROADCAST, FConnectRequestHwnd, FWinHwnd, FSessionHandle);
  216.   end;
  217. end;
  218. procedure TIPCClient.Close;
  219. begin
  220.   if FActive then
  221.   begin
  222.     if FWinHwnd <> 0 then
  223.     begin
  224.       //广播消息,客户端断开
  225.       SendMessage(HWND_BROADCAST, FClientDisconnectHwnd, FWinHwnd, FSessionHandle);
  226.      //释放由AllocateHWND创建的窗体
  227.       DeallocateHWND(FWinHwnd);
  228.       FWinHwnd := 0;
  229.       FActive := False;
  230.     end;
  231.   end;
  232. end;
  233. procedure TIPCClient.WndProc(var AMsg: TMessage);
  234. var
  235.   MsgPointer: Pointer;
  236. begin
  237.   //根据消息种类,分别执行
  238.   //WM_CopyData消息
  239.   if (AMsg.Msg = WM_COPYDATA) then
  240.   begin
  241.     MsgPointer := (TCopyDataStruct(Pointer(AMsg.lParam)^)).lpData;
  242.     if Assigned(FOnData) then
  243.       FOnData(MsgPointer);
  244.   end
  245.   //连接响应消息
  246.   else if AMsg.Msg = FConnectResposeHwnd then
  247.   begin
  248.     if not FActive then
  249.     begin
  250.       FServerWinHwnd := AMsg.wParam;
  251.       if Assigned(FOnConnect) then
  252.         FOnConnect(FServerWinHwnd);
  253.       FActive := True;
  254.     end;
  255.   end
  256.   //服务器端断开连接消息
  257.   else if AMsg.Msg = FServerDisconnectHwnd then
  258.   begin
  259.     if FActive then
  260.     begin
  261.       if AMsg.wParam = Longint(FServerWinHwnd) then
  262.       begin
  263.         if Assigned(FOnDisconnect) then
  264.           FOnDisconnect(FServerWinHwnd);
  265.         FServerWinHwnd := 0;
  266.         FActive := False;
  267.       end;
  268.     end;
  269.   end;
  270. end;
  271. procedure TIPCClient.SendMsg(MsgPointer: Pointer; ASize: DWORD);
  272. var
  273.   CopyDataStruct: TCopyDataStruct;
  274. begin
  275.   if FServerWinHwnd <> 0 then
  276.   begin
  277.     CopyDataStruct.dwData := FWinHwnd;
  278.     CopyDataStruct.cbData := ASize;
  279.     CopyDataStruct.lpData := MsgPointer;
  280.     SendMessage(FServerWinHwnd, WM_COPYDATA, FSessionHandle, lParam(@CopyDataStruct));
  281.   end;
  282. end;
  283. end.