📄 h20000419-43.htm
字号:
<p align="justify">end</p> <p align="justify">else</p> <p align="justify">begin</p> <p align="justify">//传递二次启动时的参数到第一个实例</p> <p align="justify">H := FindWindow(PChar('TForm1'), PChar('资料保密 严禁外传'));</p> <p align="justify">if ParamCount > 0 then</p> <p align="justify">begin</p> <p align="justify">L := GlobalAddAtom(PChar(ParamStr(1)));</p> <p align="justify">if H<>0 then</p> <p align="justify">SendMessage(H, WM_MYMESSAGE, 0, L); </p> <blockquote> <blockquote> <blockquote> <blockquote> <blockquote> <p align="justify">{ 传递原子句柄 }</p> </blockquote> </blockquote> </blockquote> </blockquote> </blockquote> <p align="justify">GlobalDeleteAtom(L); { 使用后释放 }</p> <p align="justify">end;</p> <p align="justify">Application.Terminate;</p> <p align="justify">end;</p> <p align="justify">end.</p> <p align="justify">在相应的窗口单元dde.pas增加对自定义消息WM_MYMESSAGE的处理:</p> <p align="justify">procedure TForm1.MyMessage(var T:TMessage); </p> <p align="justify">{对 WM_MYMESSAGE消息进行处理 }</p> <p align="justify">var</p> <p align="justify">P:Array [0..255] of char;</p> <p align="justify">begin</p> <p align="justify">GlobalGetAtomName(T.LParam, P,255); { 接受数据到p数组中 }</p> <p align="justify">。。。</p> <p align="justify">end;</p> </blockquote> </blockquote> <ul> <li><strong>使用存储映象文件</strong> </li> </ul> <p> </p> <p align="justify">这种方法相对较复杂一些。</p> <p align="justify">当Win95与Winows Nt向内存中装载文件时,使用了特殊的全局内存区。在该区域内,应用程序的虚拟内存地址和文件中的相应位置一一对应。由于所有进程共享了一个用于存储映象文件的全局内存区域,因而当两个进程装载相同模块(应用程序或DLL文件)时,它们实际可以在内存中共享其执行代码。</p> <p align="justify">笔者通过调用一个带有特殊参数的CreateFileMapping函数,来间接达到程序间共享内存的目的。下面简要解释一下该函数。</p> <p align="justify">HANDLE CreateFileMapping(</p> <p align="justify">HANDLE hFile, //文件句柄 </p> <p align="justify">LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // 可选安全属性</p> <p align="justify">DWORD flProtect, // 映象文件保护方式 </p> <p align="justify">DWORD dwMaximumSizeHigh, // 映象文件区域的底值 </p> <p align="justify">DWORD dwMaximumSizeLow, // 映象文件区域的顶值 </p> <p align="justify">LPCTSTR lpName // 映象文件的名字</p> <p align="justify">); </p> <p align="justify">如果hFile是0xFFFFFFFF,在调用程序中必须指定dwMaximumSizeHigh 和dwMaximumSizeLow参数的值以确定映象文件的大小。通过这样的参数指定,该函数就创建了一个由操作系统页文件支持的特殊逻辑映象文件,而不是由实际操作系统的文件支持的逻辑映象文件。这个逻辑映象文件可以通过复制、继承或者按名字来达到共享。至于其它参数的详细说明,请参看在线帮助。</p> <p align="justify">在建立了映象文件之后,我们可以通过调用另外一个API函数MapViewOfFile来访问它的内存,该函数会返回一个指向共享内存块的特定指针。</p> <p align="justify">LPVOID MapViewOfFile(</p> <p align="justify">HANDLE hFileMappingObject, // 映象文件句柄 </p> <p align="justify">DWORD dwDesiredAccess, // 访问方式 </p> <p align="justify">DWORD dwFileOffsetHigh, // 映象文件区域的底值 </p> <p align="justify">DWORD dwFileOffsetLow, // 映象文件区域的顶值</p> <p align="justify">DWORD dwNumberOfBytesToMap // 映射字节数</p> <p align="justify">);</p> <p align="justify">如果 dwNumberOfBytesToMap 是0,映射整个文件。</p> <p align="justify">以下举例说明:</p> <p align="justify">private</p> <p align="justify">hMapFile: THandle;</p> <p align="justify">MapFilePointer: Pointer;</p> <p align="justify">public</p> <p align="justify">{ Public declarations }</p> <p align="justify">end;</p> <p align="justify">var</p> <p align="justify">Form1: TForm1;</p> <p align="justify">implementation</p> <p align="justify">{$R *.DFM}</p> <p align="justify">procedure TForm1.FormCreate(Sender: TObject);</p> <p align="justify">begin</p> <p align="justify">hMapFile := CreateFileMapping (</p> <p align="justify">$FFFFFFFF, // 特殊内存映射句柄</p> <p align="justify">nil, page_ReadWrite, 0,10000, </p> <p align="justify">'DdhDemoMappedFile'); // 文件名</p> <p align="justify">if hMapFile <> 0 then</p> <p align="justify">MapFilePointer := MapViewOfFile (</p> <p align="justify">hMapFile, // 上面映象文件的句柄</p> <p align="justify">File_Map_All_Access, </p> <p align="justify">0, 0, 0) // 访问整个映象文件</p> <p align="justify">else</p> <p align="justify">ShowMessage ('hMapFile = 0');</p> <p align="justify">if MapFilePointer = nil then</p> <p align="justify">ShowMessage ('MapFilePointer = nil');</p> <p align="justify">end;</p> <p align="justify"> </p> <p align="justify">procedure TForm1.BtnWriteClick(Sender: TObject);</p> <p align="justify">begin</p> <p align="justify">StrCopy (PChar (MapFilePointer),</p> <p align="justify">PChar (EditWrite.Text));//把内容写入共享内存</p> <p align="justify">end;</p> <p align="justify"> </p> <p align="justify">procedure TForm1.BtnReadClick(Sender: TObject);</p> <p align="justify">var</p> <p align="justify">S: string;</p> <p align="justify">begin</p> <p align="justify">S := PChar (MapFilePointer);//从共享内存读出内容</p> <p align="justify">EditRead.Text := S;</p> <p align="justify">end;</p> <blockquote> <p align="justify">用这种方法,不但可以在不同的程序之间共享数据,还可以在同一程序的不同实例间共享数据。为了及时通知其它进程共享数据的变化,可以自定义一条用户消息,通过发消息来实现,这里不再赘述。</p> </blockquote> <p>利用以上三种方法均可以有效地实现数据传递、共享,所有的例子程序均在Delphi 3.0,4.0下调试通过。如需源码,写信至<a href="mailto:wj_email@yahoo.com">wj_email@yahoo.com</a>索要</td> </tr></tbody></table></center></div><hr align="center" SIZE="1" width="700"><p align="center" class="ourfont"><span><span><font color="#000000"> <a style="color: rgb(0,0,0); text-decoration: none" href="../../soft/network/index.htm">互联网络</font><font color="#FFFFFF"> </font></a><font color="#000000">|</span></span><a href="../../soft/system/index.htm" style="color: rgb(0,0,0); text-decoration: none">系统工具</a><span>|<span> <a href="../../soft/tools/index.htm" style="color: rgb(0,0,0); text-decoration: none">实用工具</a> | <a href="../../soft/multimedia/index.htm" style="color: rgb(0,0,0); text-decoration: none">媒体工具</a> | <a href="../../soft/image/index.htm" style="color: rgb(0,0,0); text-decoration: none">图形图像</a> | <a href="../../soft/game/index.htm" style="color: rgb(0,0,0); text-decoration: none">游戏娱乐</a> | </span><a href="../../soft/usesoft/index.htm" style="color: rgb(0,0,0); text-decoration: none">软件<span>使用</a></font><font color="#FFFFFF"> |</font> </span></span></p><hr align="center" SIZE="1" width="700"><font color="#FFE8BB"><p align="center" class="ourfont"></font><font color="#000000"><span><span>© Copyright 2000 </span></span>陕西公用计算机互联网信息中心<span><span> 版权所有 </font></p></span></span><p align="center" class="ourfont"><font color="#000000"><span><span>本站制作维护by <a style="color: rgb(0,0,0)" href="mailto:haiyuan@163.sn.cn">HAIYUAN</a></span></span></font></p><p align="center" class="ourfont"><font color="#000000"><span><span>电话:(029)8371051 8371055 8371049 联系信箱:<a href="mailto:net@163.sn.cn">net@163.sn.cn</a></span></span></font></p></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -