随笔 - 25, 文章 - 0, 评论 - 6, 引用 - 0
数据加载中……

DLL的创建与调用

创建动态链接库 (DLL) 项目:

1、从“文件”菜单中,选择“新建”,然后选择“项目…”。

2、在“项目类型”窗格中,选择“Visual C++”下的“Win32”。

3、在“模板”窗格中,选择“Win32 控制台应用程序”。

4、为项目选择一个名称,如 MathFuncsDll,并将其键入“名称”字段。 为解决方案选择一个名称,如 DynamicLibrary,并将其键入“解决方案名称”字段。

5、单击“确定”启动 Win32 应用程序向导。 在“Win32 应用程序向导”对话框的“概述”页中,单击“下一步”。

6、在“Win32 应用程序向导”中的“应用程序设置”页中,选择“应用程序类型”下的“DLL”(如果可用),或者选择“控制台应用程序”(如果“DLL”不可用)。 某些版本的 Visual Studio 不支持通过使用向导创建 DLL 项目。 您可以稍后对此进行更改,以将项目编译为 DLL。

7、在“Win32 应用程序向导”的“应用程序设置”页中,选择“附加选项”下的“空项目”。

8、单击“完成”创建项目。

9、创建导出的类或函数等,必须在类或函数前加上 __declspec(dllexport) 修饰符。 这些修饰符使 DLL 能够导出该类或函数以供其他应用程序使用。

调用动态链接库 (DLL)

1、【C++】->【General】->【additional include directories】       //  添加头文件目录
2、【Linker】->【General】->【additional library directories】    //  添加lib目录
3、【linker】->【input】->【additional dependencies】             //  添加lib文件名

将.dll可以放到工程生成的exe文件夹里面,运行exe就可以直接在当前目录下找到需要的dll文件。(真正的函数的可执行代码都在dll中,lib文件仅仅只是一个索引,而.h文件仅仅只是一个对外的接口) 
动态库的三个组成部分
.h文件作用  : 声明函数接口
.lib文件作用: 告诉链接器调用的函数在哪个DLL中
.dll文件作用: 函数可执行代码
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。完成源代码的编译和链接,有.h和.lib就够了。要使动态连接的程序运行起来,有.dll就够了。在开发和调试阶段,当然最好都有。
当我们在自己的程序中引用了一个H文件里的函数,编链器怎么知道该调用哪个DLL文件呢?这就是LIB文件的作用: 告诉链接器 调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置,这也就是为什么需要附加依赖项 .LIB文件,它起到桥梁的作用。如果生成静态库文件,则没有DLL ,只有lib,这时函数可执行代码部分也在lib文件中
目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。

posted on 2012-11-14 09:35 chenjt3533 阅读(272) 评论(0)  编辑 收藏 引用 所属分类: C/C++


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