其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

DELPHI基础教程:动态链接库编程(一)[4]


发布日期:2019年05月04日
 
DELPHI基础教程:动态链接库编程(一)[4]

Order := TInstr(PFunc)(textKey)

TInStr是一个定义好了的函数类型

type

TInStr = function(Source: PChar;Check: Char) Integer;

利用DLLs实现数据传输

DLLs中的全局内存

Windows规定DLLs并不拥有它打开的任何文件或它分配的任何全局内存块这些对象由直接或间接调用DLLs的应用程序拥有这样当应用程序中止时它拥有的打开的文件自动关闭它拥有的全局内存块自动释放这就意味着保存在DLLs全局变量中的文件和全局内存块变量在DLLs没有被通知的情况下就变为非法这将给其它使用该DLLs的应用程序造成困难

为了避免出现这种情况文件和全局内存块句柄不应作为DLLs的全局变量而是作为DLLs中过程或函数的参数传递给DLLs使用调用DLLs的应用程序应该负责对它们的维护

但在特定情况下DLLs也可以拥有自己的全局内存块这些内存块必须用gmem_DDEShare属性进行分配这样的内存块直到被DLLs显示释放或DLLs退出时都保持有效

由DLLs管理的全局内存块是应用程序间进行数据传输的又一途径下面我们将专门讨论这一问题

利用DLLs实现应用程序间的数据传输

利用DLLs实现应用程序间的数据传输的步骤为

编写一个DLLs程序其中拥有一个用gmem_DDEShare属性分配的全局内存块

服务器程序调用DLLs向全局内存块写入数据

客户程序调用DLLs从全局内存块读取数据

用于实现数据传输的DLLs的编写

用于实现数据传输的DLLs与一般DLLs的编写基本相同其中特别的地方是

定义一个全局变量句柄

var

hMem: THandle;

定义一个过程返回该全局变量的句柄该过程要包含在exports子句中

function GetGlobalMem: THandle; export;

begin

Result := hMem;

end;

在初始化代码中分配全局内存块

程序清单如下

begin

hMem := GlobalAlloc(gmem_MOVEABLE and gmem_DDESharenum)

if hMem = then

MessageDlg(Could not allocate memorymtWarning[mbOK]

end

num是一个预定义的常数

Windows API函数GlobalAlloc用于从全局内存堆中分配一块内存并返回该内存块的句柄该函数包括两个参数第一个参数用于设置内存块的分配标志可以使用的分配标志如下表所示

全局内存块的分配标志

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

标 志 意 义

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

第二个参数用于设置欲分配的字节数分配的字节数必须是的倍数因而实际分配的字节数可能比所设置的要大

由于用gmem_DDEShare分配的内存在分配内存的模块终止时自动抛弃因而不必调用GlobalFree显式释放内存

返回目录DELPHI基础教程

编辑推荐

Java程序设计培训视频教程

JEE高级框架实战培训视频教程

Visual C++音频/视频技术开发与实战

Oracle索引技术

ORACLEG数据库开发优化指南

Java程序性能优化让你的Java程序更快更稳定

C嵌入式编程设计模式

Android游戏开发实践指南

[] [] [] []

               

上一篇:DELPHI基础教程:Delphi拖放编程[3]

下一篇:DELPHI基础教程:动态链接库编程(一)[3]