DELPHI基础教程:动态链接库编程(一)[4]
Order := TInstr(PFunc)(text Key)
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_DDEShare num)
if hMem = then
MessageDlg( Could not allocate memory mtWarning [mbOK] )
end
num是一个预定义的常数
Windows API函数GlobalAlloc用于从全局内存堆中分配一块内存 并返回该内存块的句柄 该函数包括两个参数 第一个参数用于设置内存块的分配标志 可以使用的分配标志如下表所示
表 全局内存块的分配标志
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
标 志 意 义
gmem_DDEShare 分配可由应用程序共享的内存
gmem_Discardable 分配可抛弃的内存(只与gmem_Moveable连用)
gmem_Fixed 分配固定内存
gmem_Moveable 分配可移动的内存
gmem_Nopact 该全局堆中的内存不能被压缩或抛弃
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程序设计培训视频教程
J EE高级框架实战培训视频教程
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLE G数据库开发优化指南
Java程序性能优化 让你的Java程序更快 更稳定
C嵌入式编程设计模式
Android游戏开发实践指南
lishixinzhi/Article/program/Delphi/201311/25210