Welcome

首页 / 软件开发 / Delphi / 第十章-动态链接库编程(二)(1)

第十章-动态链接库编程(二)(1)2007-05-0710.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

else

MessageDlg("Couldnot Lock memory block",mtWarning,[mbOK],0);

end;

10.3.2.3 客户程序的编写

客户程序几乎是服务器程序的翻版。唯一的区别在于一个是写入数据,一个是下载数据。

下面是客户从全局内存块下载数据的程序清单。

var

hMem: THandle;

pMem: PChar;

begin

hMem := GetGlobalMem; {获得全局内存块的句柄}

if hMem <> 0 then

begin

pMem := GlobalLock(hMem); {加锁全局内存块}

if pMem <> nil then

begin

Memo1.text := StrPas(pMem); {从全局内存块读取数据}

GlobalUnlock(hMem); {解锁全局内存块}

end

else

MessageDlg("Couldnot Lock memory block",mtWarning,[mbOK],0);

end;

10.4 利用DLLs实现窗体重用

实现窗体重用是Delphi DLLs功能中一个引人注目的特色。当你创建了一个令自己满意的通用窗体并希望能在不同应用程序中使用,特别是希望能在非Delphi 应用程序中使用时,把窗体做进一个动态链接库中是最适当的。这样即使用其它工具开发的应用程序,如C++、Visual Basic等,也都可以去调用它。

包含窗体的DLLs有100K左右的部件库(Component Library)开销。可以通过把几个窗体编译成一个DLLs来最小化这笔开销。DLl中的不同窗体可以共享部件库。