/********************************************\
| 欢迎转载, 但请保留作者姓名和原文链接, 祝您进步并共勉! |
\********************************************/
动态链接库小结
作者: Jerry Cat
时间: 2006/09/02
链接: http://www.cppblog.com/jerysun0818/archive/2006/09/02/11974.html
一.库模块:
(略)
二.实现(可以使用Visual C++提供的向导来创建动态链接库和静态链接库)
1>:Win32 Static Library
2>:Win32 Dynamic-Link-Library
3>:MFC AppWizard(dll)
Regular Dll With MFC statically linked
Regular Dll using shared MFC Dll
MFC Extension Dll (using shared MFC DLL)
三.Win32 DLL可以直接使用API,但是不可以直接使用MFC
MFC AppWizard可以直接使用MFC
四.
Regular Dll using shared MFC Dll
和
MFC Extension Dll
两者比较
(表1 )
Regular Dll using shared MFC Dll
|
MFC Extension Dll (using shared MFC DLL)
|
1.
能导出
C
风格函数,全局变量
2.
能导出资源
|
1.
能导出
C
风格函数,全局变量
2.
能导出资源
3.
能导出
C++
类,成员函数,重载函数
|
允许静态或者动态链接
MFC
类库
|
只能动态链接
MFC
类库
|
它允许客户程序静态或者动态链接
|
只允许客户程序动态链接
|
|
|
五.调用
1>
隐式链接
隐式链接时,使用
DLL
的程序需要获取以下信息:
1.
包含了导出函数(类)声明的头文件
2.
导入库
(lib_
3.
实际的
DLL
使用导出函数的源文件需要
#include
(
1
)的头文件,调用导出函数与其它函数完全一样
建立可执行程序时,需要导入
LIB
文件,可通过以下方式实现
1.
Project->Setting->Link
在
Object/Library Modules
编辑框中指定
LIB
名字
2.
#pragma comment(lib,”LIB
名字
”)
例如:我们想使用
opengl
函数,我们可以
1.#include<gl/gl.h>
#include<gl/glu.h>
2.#pragma comment(lib, “glu32.lib”)
#pragma comment(lib, “opengl32.lib”)
2>
显式链接
使用
DLL
的程序在运行时通过函数调用来显式加载或卸载
DLL
,并通过函数调用来调用
DLL
的导出函数。
1.
使用
LoadLibrary
来加载
DLL
,得到模块句柄
2.
调用
GetProcessAddress
来获取应用程序要调用的导出函数指针
3.
使用结束后,用
FreeLibrary
来卸载
DLL
例如:我们想使用
xxx.dll
中的
GetVersion
函数,我们可以
typedef UINT (CALLBACK* LPFNDLLFUN)(DWORD,UINT);
HINSTANCE hDll = LoadLibrary(“xxx.dll”);
if(hDll != NULL)
{
LPFNDLLFUN lpfnDllFun1 = (LPFNDLLFUN)GetProcess(hDll, “GetVersion”);
if(lpfnDllFun1)
{
// 你的函数调用
}
FreeLibrary(hDll);
}
posted on 2006-09-02 21:37
Jerry Cat 阅读(1093)
评论(0) 编辑 收藏 引用