delphi进程间通讯例子,自定义消息传递或共享内存区

上传人:xins****2008 文档编号:104069643 上传时间:2019-10-08 格式:DOC 页数:32 大小:197KB
返回 下载 相关 举报
delphi进程间通讯例子,自定义消息传递或共享内存区_第1页
第1页 / 共32页
delphi进程间通讯例子,自定义消息传递或共享内存区_第2页
第2页 / 共32页
delphi进程间通讯例子,自定义消息传递或共享内存区_第3页
第3页 / 共32页
delphi进程间通讯例子,自定义消息传递或共享内存区_第4页
第4页 / 共32页
delphi进程间通讯例子,自定义消息传递或共享内存区_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《delphi进程间通讯例子,自定义消息传递或共享内存区》由会员分享,可在线阅读,更多相关《delphi进程间通讯例子,自定义消息传递或共享内存区(32页珍藏版)》请在金锄头文库上搜索。

1、CSDN社区 Delphi Windows SDK/API 求 delphi进程间通讯例子,自定义消息传递或共享内存区!楼主skphoebe(小鲨鱼)2005-09-20 14:00:08 在 Delphi / Windows SDK/API 提问谢谢,摆脱那位大哥供小弟学习下! 问题点数:50、回复次数:13Top 1 楼abc3000(想想就烦)回复于 2005-09-20 14:26:34 得分 0 以下例子是共享内存 实现进程间通讯,没有大的问题,就是最后个字符会被吃掉 Top2 楼abc3000(想想就烦)回复于 2005-09-20 14:27:18 得分 0 unit FileM

2、ap; interface uses Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,StdCtrls,Dialogs; type TFileMap=class(TComponent) private FMapHandle:THandle; /内存映射文件句柄 FMutexHandle:THandle; /互斥句柄 FMapName:string; /内存映射对象 FSynchMessage:string; /同步消息 FMapStrings:TStringList; /存储映射文件信息 FSize:DWord; /映射文件大

3、小 FMessageID:DWord; /注册的消息号 FMapPointer:PChar; /映射文件的数据区指针 FLocked:Boolean; /锁定 FIsMapOpen:Boolean; /文件是否打开 FExistsAlready:Boolean; /是否已经建立过映射文件 FReading:Boolean; /是否正在读取内存文件数据 FAutoSynch:Boolean; /是否同步 FOnChange:TNotifyEvent; /当内存数据区内容改变时 FFormHandle:Hwnd; /存储本窗口的窗口句柄 FPNewWndHandler:Pointer; FPOld

4、WndHandler:Pointer; procedure SetMapName(Value:string); procedure SetMapStrings(Value:TStringList); procedure SetSize(Value:DWord); procedure SetAutoSynch(Value:Boolean); procedure EnterCriticalSection; procedure LeaveCriticalSection; procedure MapStringsChange(Sender:TObject); procedure NewWndProc(

5、var FMessage:TMessage); public constructor Create(AOwner:TComponent);override; destructor Destroy;override; procedure OpenMap; procedure CloseMap; procedure ReadMap; procedure WriteMap; property ExistsAlready:Boolean read FExistsAlready; property IsMapOpen:Boolean read FIsMapOpen; published property

6、 MaxSize:DWord read FSize write SetSize; property AutoSynchronize:Boolean read FAutoSynch write SetAutoSynch; property MapName:string read FMapName write SetMapName; property MapStrings:TStringList read FMapStrings write SetMapStrings; property OnChange:TNotifyEvent read FOnChange write FOnChange; e

7、nd; implementation /构造函数 constructor TFileMap.Create(AOwner:TComponent); begin inherited Create(AOwner); FAutoSynch:=True; FSize:=4096; FReading:=False; FMapStrings:=TStringList.Create; FMapStrings.OnChange:=MapStringsChange; FMapName:=Unique & Common name; FSynchMessage:=FMapName+Synch-Now; if AOwn

8、er is TForm then begin FFormHandle:=(AOwner as TForm).Handle; /得到窗口处理过程的地址 FPOldWndHandler:=Ptr(GetWindowLong(FFormHandle,GWL_wNDPROC); FPNewWndHandler:=MakeObjectInstance(NewWndProc); if FPNewWndHandler=nil then raise Exception.Create(超出资源); /设置窗口处理过程的新地址 SetWindowLong(FFormHandle,GWL_WNDPROC,Longi

9、nt(FPNewWndHandler); end else raise Exception.Create(组件的所有者应该是TForm); end; /析构函数 destructor TFileMap.Destroy; begin CloseMap; /还原Windows处理过程地址 SetWindowLong(FFormHandle,GWL_WNDPROC,Longint(FPOldWndHandler); if FPNewWndHandlernil then FreeObjectInstance(FPNewWndHandler); /释放对象 FMapStrings.Free; FMapS

10、trings:=nil; inherited destroy; end;Top3 楼abc3000(想想就烦)回复于 2005-09-20 14:27:33 得分 30/打开文件映射,并映射到进程空间 procedure TFileMap.OpenMap; var TempMessage:array0.255 of Char; begin if (FMapHandle=0) and (FMapPointer=nil) then begin FExistsAlready:=False; /创建文件映射对象 FMapHandle:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,FSize,PChar(FMapName); if (FMapHandle=INVALID_HANDLE_VALUE) or (FMapHandle=0) then raise Exception.Create(创建文件映射对象失败!) else begin /判断是否已经建立文件映射了 if (FMapHandle0) and (GetLastError=ERROR_ALREADY_EXISTS) then FExistsAlready:=True;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号