编者:李国帅
qq:9611153 微信lgs9611153
时间:20050928
背景原因:
Vc中动态链接库是重要的东西,这篇文章对动态库的建立,使用和编译过程进行可概要整理。
大致过程如下:
所需资源:
Vc,dll
库文件一般指计算机上的一类文件,分两种,一种是静态库,另一种是动态库即DLL(Dynamic Link Library)文件,又叫动态链接库文件。静态库和动态库的区别是:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。
如何建立dll
使用vc6建立一个空白的不带mfc的win32动态连接库,加入三个文件
1、主文件,提供dll函数的代码
//
// This code implements the DLL function.
//***************************************************************
// snd.cpp
#include <windows.h>
#include "snd.h"
void MultiHonk(DWORD iterations)
{
UINT i;
for (i=0; i<iterations; i++)
{
Beep(200, 50);
Sleep(1000);
}
}
2、头文件,提供函数声明
// // This code demonstrates the interface specification for a DLL. //***************************************************************
// snd.h
extern "C" { void MultiHonk(DWORD iterations); } |
3、定义文件
def文件告诉库管理器该dll文件将输出哪些函数到使用它的应用程序中
dll不必输出它包含的全部函数
; snd.def
LIBRARY SND
EXPORTS MultiHonk
|
如何使用dll
加载时链接,当应用程序启动时,系统自动加载dll文件,因为它简单透明,应用程序员不需要在应用程序中设置什么就能使用dll。
使用vc6建立一个不带mfc的win32的控制台应用程序
添加dll相关文件
1、首先把上面编译生成的dll文件放在应用程序exe所在的目录中,或系统环境变量path中定义的某个地方。
2、添加lib文件和sndlt.h文件到工程中
把生成的lib文件复制到应用程序项目文件所在目录中,或编译器可以找到的系统lib目录中。
另外,应用程序还要访问DLL头文件(sndlt.h)————描述dll文件,复制到项目文件所在目录,或编译器知道的标准头文件目录中。
Dll的导出sndlt.h可以是一样的,如果在C++中引用需要加入extern "C"标识。
// sndlt.h extern "C" { void MultiHonk(DWORD iterations); } |
建立调用文件
// This code uses the simple DLL to test it in load-time mode.
//***************************************************************
// honker1.cpp
#include <windows.h>
#include <stdlib.h>
#include <iostream.h>
#include "sndlt.h"
VOID main(VOID)
{
DWORD iterations;
CHAR iterStr[100];
cout << "Enter the number of beeps to produce: ";
cin.getline(iterStr, 100);
iterations=atoi(iterStr);
// make the beeps
MultiHonk(iterations);
}
程序编译过程
s
注意点
DEF文件的作用:
dll依赖库管理器建立应用程序用于链接dll文件的lib文件。为库管理器声明库的名称和dll输出的所有函数的名称。
对于dll文件中的每个被输出的函数,在def文件中的exports语句中创建一个包含函数名的行。
dll搜索路径:
应用程序的加载目录,当前目录,winnt system目录,winnt目录,path目录等
创建dll头文件,声明和描述dll文件中的所有函数,确保头文件中的所有函数包含在extern "C"语句中。
若采用加载时链接而且没有入口点函数,则可以在应用程序中利用同一头文件。
如采用运行时链接,则需要给应用程序创建一个不同的头文件。
两种导出方法:
1、使用def文件,需要使用export "c",生成dll文件lib,exp等文件,调用时必须使用头文件和lib,dll文件,执行时必须使用dll文件
2、使用导出函数( __declspec(dllexport) __declspec(dllimport) ) ,调用时不必需要lib文件和头文件。但需要指定调用的函数接口