Windows的动态链接库原理及使用2

sanya100200300

sanya100200300

2016-02-19 13:06

下面,图老师小编带您去了解一下Windows的动态链接库原理及使用2,生活就是不断的发现新事物,get新技能~
3  利用DLLs实现数据传输
  
  3.1 DLLs中的全局内存
  
    Windows规定:DLLs并不拥有它打开的任何文件或它分配的任何全局内存块。这些对象由直接或间接调用DLLs的应用程序拥有。这样,当应用程序中止时,它拥有的打开的文件自动关闭,它拥有的全局内存块自动释放。这就意味着保存在DLLs全局变量中的文件和全局内存块变量在DLLs
  没有被通知的情况下就变为非法。这将给其它使用该DLLs的应用程序造成困难。
    为了避免出现这种情况,文件和全局内存块句柄不应作为DLLs的全局变量,而是作为DLLs中过程或函数的参数传递给DLLs使用。调用DLLs的应用程序应该负责对它们的维护。
    但在特定情况下,DLLs也可以拥有自己的全局内存块。这些内存块必须用gmem_DDEShare属性进行分配。这样的内存块直到被DLLs显示释放或DLLs退出时都保持有效。
    由DLLs治理的全局内存块是应用程序间进行数据传输的又一途径,下面我们将专门讨论这一问题。
  
  3.2 利用DLLs实现应用程序间的数据传输
  
    利用DLLs实现应用程序间的数据传输的步骤为:
    1. 编写一个DLLs程序,其中拥有一个用gmem_DDEShare属性分配的全局内存块;
    2. 服务器程序调用DLLs,向全局内存块写入数据;
    3. 客户程序调用DLLs,从全局内存块读取数据。
  
  3.2.1        用于实现数据传输的DLLs的编写
  
    用于实现数据传输的DLLs与一般DLLs的编写基本相同,其中非凡的地方是:
    1. 定义一个全局变量句柄:
  
          var
            hMem: THandle;
  
    2. 定义一个过程,返回该全局变量的句柄。该过程要包含在eXPorts子句中。如:
  
          function GetGlobalMem: THandle; export;
          begin
            Result := hMem;
          end;
           
    3. 在初始化代码中分配全局内存块:
           
          程序清单如下:
  
          begin
            hMem := GlobalAlloc(gmem_MOVEABLE and gmem_DDEShare,num);
            if hMem = 0 then
               MessageDlg('Could not allocate memory',mtWarning,[mbOK],0);
          end.
  
    num是一个预定义的常数。
      Windows API函数GlobalAlloc用于从全局内存堆中分配一块内存,并返回该内存块的句柄。该函数包括两个参数,第一个参数用于设置内存块的分配标志。可以使用的分配标志如下表所示。
                          表3  全局内存块的分配标志
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                  标      志                              意      义
  
     ---------------------------------
          gmem_DDEShare           分配可由应用程序共享的内存
          gmem_Discardable                分配可抛弃的内存(只与gmem_Moveable连用)
          gmem_Fixed                      分配固定内存
          gmem_Moveable           分配可移动的内存
          gmem_Nocompact          该全局堆中的内存不能被压缩或抛弃
          gmem_Nodiscard          该全局堆中的内存不能被抛弃
          gmem_NOT_Banked 分配不能被分段的内存
          gmem_Notify                     通知功能。当该内存被抛弃时调用GlobalNotify函数
          gmem_Zeroinit           将所分配内存块的内容初始化为零
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  
    有两个预定义的常用组合是:
  
      GHND  =  gmem_Moveable and gmem_Zeroinit
      GPTK  =  gmem_Fixed and gmem_Zeroinit
  
    第二个参数用于设置欲分配的字节数。分配的字节数必须是32的倍数,因而实际分配的字节数可能比所设置的要大。
    由于用gmem_DDEShare分配的内存在分配内存的模块终止时自动抛弃,因而不必调用GlobalFree显式释放内存。
  
  3.2.2        服务器程序的编写
  
    服务器程序必须包含对DLL的调用代码,如:
  
          function GetGlobalMem: THandle; far; external 'c:dllsglbmem';
  
    通过调用该函数,服务器可以获得全局内存块的句柄。
    在写入数据前,服务器必须锁定全局内存,以避免在写入过程中Windows移动该内存块的位置。
    函数GlobalLock锁定全局内存并返回指向该内存块的指针:
  
          pMem := GlobalLock(hMem);
  
    对pMem的任何修改都会反映到全局内存块中。
    对内存块进行操作后,调用GlobalUnLock进行解锁。内存块操作之后尽早解锁,有利于Windows充分利用内存资源。
    服务器写入数据的实现代码如下。
  
          var
            hMem: THandle;
            pMem: PChar;
          begin
  
             hMem := GetGlobalMem;             {获得全局内存块的句柄}
            if hMem 0 then
            begin
              pMem := GlobalLock(hMem);    {加锁全局内存块}
              if pMem nil then
              begin
                StrPCopy(pMem,Memo1.text);  {向全局内存块写入数据}
                GlobalUnlock(hMem);         {解锁全局内存块}  
              end
展开更多 50%)
分享

猜你喜欢

Windows的动态链接库原理及使用2

编程语言 网络编程
Windows的动态链接库原理及使用2

Windows的动态链接库原理及使用1

编程语言 网络编程
Windows的动态链接库原理及使用1

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

链接库动态链接库详细介绍

编程语言 网络编程
链接库动态链接库详细介绍

动态链接库编程(二)

Delphi
动态链接库编程(二)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Delphi 动态链接库编程

编程语言 网络编程
Delphi 动态链接库编程

动态链接库编程(一)

Delphi
动态链接库编程(一)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

如何修改注册表加速win7的关机速度

如何修改注册表加速win7的关机速度

jquery validate.js表单验证的基本用法入门

jquery validate.js表单验证的基本用法入门
下拉加载更多内容 ↓