博文

VC++动态链接库编程之基础慨念(2009-02-21 11:05:00)

摘要:1.概论   先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。   对动态链接库,我们还需建立如下概念:  (1)DLL 的编制与具体的编程语言及编译器无关  只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。  (2)动态链接库随处可见  我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。  一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。  (3)VC动态链接库的分类  Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。  非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。  由于本......

阅读全文(1767) | 评论:3

VC中使用外部的lib,dll,头文件(2009-02-21 11:04:00)

摘要:  2007-11-13 20:27 VC中使用DLL需要用到相应的lib文件和头文件, 编译时需要用到头文件,链接时用到lib文件,运行exe时用到dll。 添加头文件目录可以使用tools->options 中的directories下的include files进行添加 添加lib文件可以使用两种方法:1、在TOOLS->OPTIONS->Directories->Library files,加入你的LIB文件所在的目录,然后在Project->setting->object->Object/Library Modules中加入你的LIB文件,如you.lib2、在Project->Add to Project->Files中将你的LIB文件直接加入到工程中去                                                    3.首先要使用该函数的地方加上该LIB的头文件,然后在project->setting->link->加上你的LIB文件的路径 DLL则是在运行exe时,与其放在同一目录下即可   没有.lib文件,VC也可以调用DLL中的函数。QA000325 "如何使程序不出现在任务列表中"就是一个使用LoadLibrary和GetProcAddress调用DLL中的函数的例子,当然这个办法比使用.lib麻烦。VB虽然可以不通过.lib调用DLL,但你所能调用的DLL非常受限制。如果没有.lib,你可以使用前面提到的方法,或者参考QA003675 "如何将dll翻译成*.lib文件使用"建......

阅读全文(5999) | 评论:1

一个关于VC头文件的问题.(2009-02-21 09:47:00)

摘要: 一个关于VC头文件的问题. 时间:2007-06-09 来源:开发者参考网(devtopic.com) 类别:C/C++ 内容提要:一个关于VC头文件的问题.我写了一个头文件: myhead.h然后我实现了头文件中定义的函数: myhead.cpp为什么在VC下,我在主程序中要#include myhead.h 而不是 #include myhead.cpp我的言下之意是:VC怎么找到myhead.h对应的实现myhead.cpp如果答案是同一?... 一个关于VC头文件的问题.我写了一个头文件: myhead.h然后我实现了头文件中定义的函数: myhead.cpp为什么在VC下,我在主程序中要#include "myhead.h" 而不是 #include "myhead.cpp"我的言下之意是:VC怎么找到myhead.h对应的实现myhead.cpp如果答案是同一文件名的话,那如果我不是用myhead.cpp来实现的,而是 myhead_impl.cpp来实现,VC岂不找不到了? 回复1:一般来说 XX.cpp都包含了XX.h的头文件的哒! 回复2:你的程序调用的时候只需要知道这个函数是怎么声明的就可以了但比如在链接的时候提供包含实现的obj文件或者lib文件. 回复3:cpp都会包含.h 回复4:楼主应该了解一下编译原理。简单点说,你的每一个CPP文件都会对应编译成一个.OBJ文件,你的每一个资源.rc文件会编译成一个.RES文件。最终的链接步骤就是将各个文件整合关联,并形成目标文件。C/C++语言只要求,在使用标识符前,声明过就可以。如果是函数,那么你只要在头文件里声明过就行了。具体的定义要放在.cpp中。这是因为:1.C/C++语言中的函数,声明可以有多个,但定义只能有一次。例如:void fun();void fun();void fun();void fun();void fun(){//…………}是合理的。2.我们把函数的声明放在.h中,函数的定义放在.cpp中。如果定义也放在.h中,那么多个cpp用到此函数,都包含.h就会出现重定义的问题。同理,这也是为什么我们不去包含.cpp的原因,因为那是具体的定义。例如:1.h有函数fun的声明,2.cp......

阅读全文(3089) | 评论:0

什么是lib文件,lib和dll的关系如何(2009-02-21 09:33:00)

摘要:什么是lib文件,lib和dll的关系如何 (1)lib是编译时需要的,dll是运行时需要的。 如果要完成源代码的编译,有lib就够了。 如果也使动态连接的程序运行起来,有dll就够了。 在开发和调试阶段,当然最好都有。 (2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。 (3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。......

阅读全文(707) | 评论:1

VC 工程文件中的文件项(2009-02-20 20:55:00)

摘要:.APS:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度。资源辅助文件。 .BMP:位图资源文件。 .BSC:浏览信息文件,由浏览信息维护工具(BSCMAKE)从原始浏览信息文件(.SBR)中生成,BSC文件可以用来在源代码编辑窗口中进行快速定位。用于浏览项目信息的,如果用source brower的话就必须有这个文件。可以在project options里去掉Generate Browse Info File,这样可以加快编译进度。 .C:用C语言编写的源代码文件。 .CLW:ClassWizard生成的用来存放类信息的文件。classwizard信息文件,ini文件的格式。 .CNT:用来定义帮助文件中“Contents”的结构。 .CPP或.CXX:用C++语言编写的源代码文件。 .CUR:光标资源文件。 .DEF:模块定义文件,供生成动态链接库时使用。 .DLG:定义对话框资源的独立文件。这种文件对于VC工程来说并非必需,因为VC一般把对话框资源放在.RC资源定义文件中。 .DSP:VC开发环境生成的工程文件,VC4及以前版本使用MAK文件来定义工程。项目文件,文本格式。 .DSW:VC开发环境生成的WorkSpace文件,用来把多个工程组织到一个WorkSpace中。工作区文件,与.dsp差不多。 .EXP:由LIB工具从DEF文件生成的输出文件,其中包含了函数和数据项目的输出信息,LINK工具将使用EXP文件来创建动态链接库。只有在编译DLL时才会生成,记录了DLL文件中的一些信息。 .H、.HPP或.HXX:用C/C++语言编写的头文件,通常用来定义数据类型,声明变量、函数、结构和类。 .HLP:Windows帮助文件。 .HM:在Help工程中,该文件定义了帮助文件与对话框、菜单或其它资源之间ID值的对应关系。 .HPJ:由Help Workshop生成的Help工程文件,用来控制Help文件的生成过程。 .HPG,生成帮助的文件的工程。 .ICO:图标资源文件。 .ILK:连接过程中生成的一种中间文件,只供LINK工具使用。 .INI:配置文件。 .LIB:库文件,LINK工具将使用它来连接各种输入库,以便最终生成EXE文件。 .LIC:用户许可证书文件,使用某些ActiveX控件时需要该文件......

阅读全文(1125) | 评论:0