VC dll程序的编写与调用 笔记

来源:互联网 发布:af第三方数据监测公司 编辑:程序博客网 时间:2024/05/17 03:56

一、VC动态链接库的分类

Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLLMFC规则DLL)、MFC Extension DLLMFC扩展DLL)。

  非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFCMFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。

 

二、静态链接库的编写与使用

1.         静态链接库的编写

1)         新建一个静态链接库工程

2)         给工程新建lib.cpp文件,添加库函数代码:

#include "lib.h"
int add(int x,int y)
{
return x + y;
}

3)         新建lib.h文件,添加声明:

#ifndef LIB_H
#define LIB_H
extern "C" int add(int x,int y);
   //声明为C编译、连接方式的外部函数

#endif

编译,将生成*lib文件。

2.         静态链接库的调用

新建工程,将头文件lib.h*.lib拷到工程下。

main.cpp文件前面,添加如下代码:

#include "lib.h"
#pragma comment( lib, "ibTest.lib" )
 //指定与静态库一起连接

这样就能使用库中的函数int add(int x,int y)了。

(注:#pragma comment( lib, "ibTest.lib" ) 这一句也可以在设置中代替:tools->options->directories->library files中,填入库文件路径

还有一种方法,(需在dllTest工程中添加lib.def文件)

下面的代码演示了怎样同.def文件将函数add声明为DLL导出函数(需在dllTest工程中添加lib.def文件):

; lib.def : 导出DLL函数

LIBRARY dllTest

EXPORTS

add @ 1

.def文件的规则为:

(1)LIBRARY语句说明.def文件相应的DLL

(2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);

 (3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。

 由此可以看出,例子中lib.def文件的含义为生成名为“dllTest”的动态链接库,导出其中的add函数,并指定add函数的序号为1

(摘自http://blog.csdn.net/hnarke/archive/2008/04/10/2277557.aspx

三、动态链接库

1.         动态链接库的编写

建一个动态链接库工程,其他与静态链接库一样。

 

2.         动态链接库的调用

1)         在头文件或CPP文件前面定义函数指针类型:

typedef int(*lpAddFun)(int, int); //宏定义函数指针类型

2)         定义句柄及调用代码如下:

HINSTANCE hDll; //DLL句柄

lpAddFun addFun; //函数指针
hDll = LoadLibrary("..//Debug//dllTest.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "add");
if (addFun != NULL)

{
int result = addFun(2, 3);
printf("%d", result);
}
FreeLibrary(hDll);
}