vc 动态链接库编程
---恢复内容开始---
学习vc,避免不了的要用到库函数。今天在群里有人问,c++写的dll,在vb里面是不是可以调用。正好自己这方面的知识也有些匮乏,所幸今天整理一下,供各位学习之用。
DLL(Dynamic Linkable Library)就是一个库,可以提供给你一些变量,类或函数。在库的发展史上经历了“无库-静态库-动态库”发展历程。
静态链接库是lib,动态链接库dll,都是实现代码共享。lib的指令都包含在exe文件中了,dll则不必包涵在exe中,exe执行是可以动态的引用和卸载与exe独立的dll文件。还有区别是静态库中不允许含有其他的静态或者动态库,dll则还可以再包含动态库和静态库。
对动态链接库需要如下认识:
1)与编译器器和编写语言无关
只要遵循约定的dll接口编程规范和调用方式,各种语言写的dll都可以互相调用。譬如windows 系统提供的api,任何语言都可以调用不管是vc,vb还是delphi.
2)常见动态链接库
在windows系统system32里面有kernel32.dll,user32,gui32.dll。windowsAPI大都包含这些dll.kernel32.dll主要是处理内存管理和进程调度,user32.dll主要是与用户界面的交互,gui32.dll主要是负责绘图方面的操作。
常用的messagebox就包含在user32.dll里面
3)vc动态库的分类
vc支持三种动态链接库Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL).
非mfc动态库不采用mfc类库结构,导出函数提供的是C接口,可以被非mfc程序和mfc程序调用,mfc扩展dll采用mfc动态链接版本创建,只能被mfc类库编写的程序调用。mfc规则dll包含一个继承自Cwinapp的一个类,但是无消息循环。
静态链接库:
在vc 中新建一个静态链接库,并创建lib.c和lib.h,源代码如下
lib.h
#ifndef LIB_H
#define LIB_H
extern "C" int add(int x,int y);//声明为C编译,连接方式的外部函数
#endif
lib.c
#include "lib.h"
int add(int x,int y)
{
return x+y;
}
编译这个工程就可以得到一个.lib文件了,该文件就是一个库函数,提供了add功能,将.lib文件和头文件交给用户,用户就可以使用add函数了。下面来看看怎么使用这个库,在刚才的工程所在的工作区里新建一个工程libcall,包含一个main.c文件,他演示了静态链接库的调用方法。
#include<stdo.h>
#include "..\lib.h"
#pragma comment (lib,"..\\debug\\libTest.lib"); //指定与静态库一起链接
int main(int argc,char* argv[])
{
printf("%d",add(2,3));
}
静态链接库的调用就是这么简单,或许我们每天都在用,可是我们没有明白这个概念。代码中#pragma comment( lib , "..\\debug\\libTest.lib" )的意思是指本文件生成的.obj文件应与libTest.lib一起连接。
未完。。。待续
---恢复内容结束---