楼上的代码有点小bug,跨进程发送自定义消息最好用registerwindowmessage函数保证两个应用程序之前使用一致的消息编号。我把楼上的程序加上了这两句<br><br>unit Unit1;<br>interface<br><br>uses<br> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br> StdCtrls;<br><br>const<br> WM_DATA = WM_USER + 1024;<br>type<br> PShareMem = ^TShareMem;<br> TShareMem = record<br> Data: array[0..255] of char;<br> end;<br> TForm1 = class(TForm)<br> Button1: TButton;<br> procedure Button1Click(Sender: TObject);<br> procedure FormDestroy(Sender: TObject);<br> procedure FormCreate(Sender: TObject);<br> private<br> { Private declarations }<br> public<br> { Public declarations }<br><br> end;<br><br>var<br> Form1: TForm1;<br> PShare: PShareMem;<br>implementation<br><br>{$R *.DFM}<br>var<br> HMapping: THandle;<br> HMapMutex: THandle;<br>const<br> MAPFILESIZE = 1000;<br> REQUEST_TIMEOUT = 1000;<br><br>procedure OpenMap;<br>begin<br> {创建一个文件映射内核对象}<br> HMapping := CreateFileMapping(<br> $FFFFFFFF,<br> nil,<br> PAGE_READWRITE,<br> 0,<br> SizeOf(TShareMem),<br> {这个文件映射对象的名字用于与其他进程共享该对象,}<br> pchar('Map Name')<br>  
;<br> if (hMapping = 0) then<br> begin<br> ShowMessage('不能创建内存映射文件');<br> Application.Terminate;<br> exit;<br> end;<br> {将文件数据映射到进程的地址空间}<br> {当创建了一个文件映射对象之后,仍然必须让系统为文件的数据保留<br> 一个地址空间区域,并将文件的数据作为映射到该区域的物理存储器进行提交。<br> }<br> PShare := PShareMem(MapViewOfFile(HMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0));<br> if PShare = nil then<br> begin<br> CloseHandle(HMapping);<br> ShowMessage('Can''t View Memory Map');<br> Application.Terminate;<br> exit;<br> end;<br><br> {既然我们通过pvFile得到了映象视图的起始地址,那么可以对视图做一些操作了}<br>end;<br><br>procedure CloseMap;<br>begin<br> if PShare <> nil then<br> {从进程的地址空间中撤销文件数据的映象}<br> UnMapViewOfFile(PShare);<br> if HMapping <> 0 then<br> CloseHandle(HMapping);<br>end;<br><br>function LockMap: Boolean;<br>begin<br> Result := true;<br> {创建互斥对象}<br> HMapMutex := CreateMutex(nil, false,<br> pchar('MY MUTEX NAME GOES HERE'));<br> if HMapMutex = 0 then<br> begin<br> ShowMessage('不能创建互斥对象');<br> Result := false;<br> end else begin<br> if WaitForSingleObject(HMapMutex, REQUEST_TIMEOUT)<br> = WAIT_FAILED then<br> begin<br> ShowMessage('不能对互斥对象加锁!');<br> Result := false;<br> end<br> end<br>end;<br><br>procedure UnlockMap;<br>begin<br> {关闭文件映射对象和文件对象}<br> ReleaseMutex(HMapMutex);<br> CloseHandle(HMapMutex);<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> str: pchar;<br>begin<br> str := pchar('简单的共享内存的例子');<br> registerwindowmessage(pchar('messageid'));//应该再加上这一句最好。<br> CopyMemory(@(pShare^.data), Str, Length(str));<br> {发送消息表明有数据}<br> PostMessage(FindWindow(nil, 'MyForm'), WM_DATA, 1, 1)<br>end;<br><br>procedure TForm1.FormDestroy(Sender: TObject);<br>begin<br> UnlockMap;<br> CloseMap;<br>end;<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br> OpenMap;<br> LockMap;<br>end;<br><br>end.<br><br><br>unit Unit2;<br><br>interface<br><br>uses<br> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br> StdCtrls;<br><br>const<br> WM_DATA = WM_USER + 1024;<br>type<br> PShareMem = ^TShareMem;<br> TShareMem = record<br> Data: array[0..255] of char;<br> end;<br> TMyForm = class(TForm)<br> Memo1: TMemo;<br> Button1: TButton;<br> procedure FormCreate(Sender: TObject);<br> procedure Button1Click(Sender: TObject);<br> private<br> { Private declarations }<br> public<br> { Public declarations }<br> procedure getShareInfo(var Msg: TMessage); message WM_DATA; {处理WM_DATA}<br> end;<br><br>var<br> MyForm: TMyForm;<br> PShare: PShareMem;<br> MapHandle: THandle;<br><br>implementation<br><br>{$R *.DFM}<br><br>procedure TMyForm.getShareInfo(var Msg: TMessage); {处理WM_DATA}<br>begin<br> if msg.LParam=1 then {是我们设定的消息参数}<br> Memo1.Text := PShare^.Data;<br>end;<br><br>procedure TMyForm.FormCreate(Sender: TObject);<br>begin<br>registerwindowmessage(pchar('messageid'));//再加上此句<br><br> MapHandle := OpenFileMapping(FILE_MAP_WRITE, {获取完全访问映射文件}<br> False, {不可继承的}<br> pchar('Map Name')); {映射文件名字}<br> if MapHandle = 0 then<br> begin<br> ShowMessage('不能定位内存映射文件块!');<br> Halt;<br> end;<br> PShare := PShareMem(MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0));<br> if PShare = nil then<br> begin<br> CloseHandle(MapHandle);<br> ShowMessage('Can''t View Memory Map');<br> Application.Terminate;<br> exit;<br> end;<br> FillChar(PShare^, SizeOf(TShareMem), 0);<br>end;<br><br>procedure TMyForm.Button1Click(Sender: TObject);<br>begin<br> CloseHandle(MapHandle);<br> close;<br>end;<br><br>end.<br> <br><br> <br>