春暖花开
雪化了,花开了,春天来了
posts - 149,comments - 125,trackbacks - 0

        DLL, 动态链接库, Dynamic-link library.一直以来都是Windows操作系统的基石。Window应用程序编程接口提供的所有函数都包含在DLL中。其中三个最重要的DLL分别是Kernel32.dll,User32.dll,GDI32.dll。Kernel32.dll ,包含的函数用来管理内存、进程以及线程;User32.dll包含的函数用来执行与用户界面相关的任务,如创建窗口和发送消息。GDI32.dll,包含的函数用来绘制图像和显示文字。Windows Mobile中重要的DLL是Coredll.dll.

         Windows系统广泛使用DLL,那么我们使用DLL的理由是什么?下面是在《Windows 核心编程中》摘录的一部分:
         一是扩展了应用程序的特性;
          二是简化了项目的管理;
          三是有助于节省内存;
          四是促进了资源的共享;
          五是促进了本地化;
         六是有助于解决平台间的差异;
         七是可以用于特殊目的。 
         目前用到的地方在 节省内存、资源共享、本地化、特殊目的。这几个是我在项目中见过的。DLL如何使用呢?一般有两种方法,一是隐式载入时链接(implicit load-time linking)和显示运行时链接(explicit run-time linking)。
         隐式链接,常用的方法是将DLL的头文件和LIB文件包含到执行文件程序中,相应DLL放到执行文件对应的目录。基本就OK了。
          例如:
           DLL为MyLib.dll,其头文件为MyLib.h, LIB文件为MyLib.lib。
           我们在执行文件中使用是,需要做如下操作:
           #include "MyLib.h"
           #pragma comment(lib, "MyLib.lib")

           即可实现隐式调用,变量、函数、类就可实现调用。
           这里lib文件非常小,它并不包含任何函数或变量,它只是列出了所有被导出的函数和变量的变量名,具体的实现在dll文件中。编译阶段不包含Lib文件会出错的。
         显示链接,在应用程序运行的过程中,显示地载入所需的DLL。
         一般可以使用LoadLibrary和FreeLibrary来实现加载和卸载DLL。那么如何判断一个DLL是否已经被映射到了进程的地址空间中?我们可以使用GetModuleHandle.
          如:
           HMODULE hInstDll = GetModuleHandle(TEXT("MyLib"));
           if (hInstDll == NULL)
           {
                hInstDll = LoadLibrary(TEXT("MyLib"));
            }
           我们已经知道如何显示加载DLL,那如何显示调用其中的变量、函数、类呢?
          例如在DLL中,我们有一个变量 g_nResult, 函数Add,我们在执行程序中如何调用呢?可以利用GetProcAddress。
           对于变量:
           int nResult =*(int*)GetProcAddress(hInstDll, "g_nResult");
           对于函数:
            typedef   int   (*FUNC)(int, int); 
            FUNC pfn = (FUNC)GetProcAddress(hInstDll, "Add");

           这是今天学习到的关于DLL的一点知识。
            

posted on 2009-10-02 16:43 Sandy 阅读(652) 评论(0)  编辑 收藏 引用 所属分类: windows学习

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理