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

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;

时间: 2024-10-30 01:03:56

Windows的动态链接库原理及使用2的相关文章

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

1.Windows的动态链接库原理 动态链接库(DLLs)是从C语言函数库和Pascal库单元的概念发展而来的.所有的C语言标准库函数都存放在某一函数库中,同时用户也可以用LIB程序创建自己的函数库.在链接应用程序的过程中,链接器从库文件中拷贝程序调用的函数代码,并把这些函数代码添加到可执行文件中.这 种方法同只把函数储存在已编译的.OBJ文件中相比更有利于代码的重用. 但随着Windows这样的多任务环境的出现,函数库的方法显得过于累赘.如果为了完成屏幕输出.消息处理.内存管理.对话框等操作,

剖析Windows任务管理器开发原理与实现

Windows2000/XP内含的任务管理器(Taskmgr)相信大家都熟悉吧,相比之下XP里的要比2000功能更加强大,返回的信息也更加的详细,不过您是否觉得还有很多希望获得的消息没有包含在里面吗?您是否觉得Windows的系统管理工具箱里的东西太分散了吗?下面就让我们看看它们的开发原理,并动手实现一个真正的任务管理器.现在我们是调用Win32API来实现这些功能的,但是大家都说MS隐藏了太多的细节,以后我们将讨论更多关于Windows内核的东东. 可能大家对任务管理器里最熟悉的功能要数进程管

Windows热键注册原理

要像系统注册一个全局热键,需要用到RegisterHotKey,函数用法如下(MSDN):BOOLRegisterHotKey(HWNDhWnd,intid,UINTfsModifiers,UINTvk);函数功能:该函数定义一个系统范围的热键. 函数原型:BOOLRegisterHotKey(HWNDhWnd,intid,UINTfsModifiers,UINTvk): 参数: hWnd:接收热键产生WM_HOTKEY消息的窗口句柄.若该参数NULL,传递给调用线程的WM_HOTKEY消息必须

Windows服务编写原理及探讨(4)

(四)一些问题的讨论 前面几章的内容都是服务的一些通用的编写原理,但里面隐含着一些问题,编写简单的服务时看不出来,但遇到复杂的应用就会出现一些问题,所以本章就是用来分析.解决这些问题的,适用于高级应用的开发人员.我这一章的内容都是经过实验得到的,很有实际意义. 我在第一章里面就说过,是由一个服务的主线程执行CtrlHandler函数,它将收到各种控制命令,但是真正处理命令,执行操作的是ServiceMain的线程.现在,当一个SERVICE_CONTROL_STOP到达之后,你作为一个开发者,要

Windows服务编写原理及探讨(1)

有那么一类应用程序,是能够为各种用户(包括本地用户和远程用户)所用的,拥有用户授权级进行管理的能力,并且不论用户是否物理的与正在运行该应用程序的计算机相连都能正常执行,这就是所谓的服务了. (一)服务的基础知识 Question 1. 什么是服务?它的特征是什么? 在NT/2000中,服务是一类受到操作系统优待的程序.一个服务首先是一个Win32可执行程序,如果要写一个功能完备且强大的服务,需要熟悉动态连接库(Dlls).结构异常处理.内存映射文件.虚拟内存.设备I/O.线程及其同步.Unico

Windows服务编写原理及探讨(3)

(三)对服务的深入讨论之下 现在我们还剩下一个函数可以在细节上讨论,那就是服务的CtrlHandler函数. 当调用RegisterServiceCtrlHandler函数时,SCM得到并保存这个回调函数的地址.一个SCP调一个告诉SCM如何去控制服务的Win32函数,现在已经有10个预定义的控制请求: Control code Meaning SERVICE_CONTROL_STOP Requests the service to stop. The hService handle must

Windows服务编写原理及探讨(2)

(二)对服务的深入讨论之上 上一章其实只是概括性的介绍,下面开始才是真正的细节所在.在进入点函数里面要完成ServiceMain的初始化,准确点说是初始化一个SERVICE_TABLE_ENTRY结构数组,这个结构记录了这个服务程序里面所包含的所有服务的名称和服务的进入点函数,下面是一个SERVICE_TABLE_ENTRY的例子: SERVICE_TABLE_ENTRY service_table_entry[] ={ { "MyFTPd" , FtpdMain }, { "

第十章-动态链接库编程(二)(4)

10.4.2.2 Delphi应用程序调用重用窗体 在Delphi应用程序中调用重用窗体,首先必须包含passform.dll的两个输出函数: function GetPassword(Password: PChar): Boolean; far; external 'c:\dlls\PassForm'; function SetPassword(PassWord: PChar): Boolean; far; external 'c:\dlls\PassForm'; 这位于程序单元的implem

第十章-动态链接库编程(一)(2)

10.2.1.3 DLLs中的变量和段 一个DLLs拥有自己的数据段(DS),因而它声明的任何变量都为自己所私有.调用它的模块不能直接使用它定义的变量.要使用必须通过过程或函数界面才能完成.而对DLLs来说,它永远都没有机会使用调用它的模块中声明的变量. 一个DLLs没有自己的堆栈段(SS),它使用调用它的应用程序的堆栈.因此在DLL中的过程.函数绝对不要假定DS = SS.一些语言在小模式编译下有这种假设,但使用Delphi可以避免这种情况.Delphi绝不会产生假定DS = SS的代码,De