⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 h20000419-43.htm

📁 对于学习很有帮助
💻 HTM
📖 第 1 页 / 共 2 页
字号:
        <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 &gt; 0 then</p>        <p align="justify">begin</p>        <p align="justify">L := GlobalAddAtom(PChar(ParamStr(1)));</p>        <p align="justify">if H&lt;&gt;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 &lt;&gt; 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">&nbsp; <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>&nbsp; </span></span></p><hr align="center" SIZE="1" width="700"><font color="#FFE8BB"><p align="center" class="ourfont"></font><font color="#000000"><span><span>&copy;&nbsp;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 + -