VC++动态链接库DLL编程深入浅出
4.非MFC DLL
4.1一个简单的DLL
首先在VC++中new一个win 32 Dynamic-Link Library工程dllTest。MFC AppWizard(dll)建立的是MFC动态链接库。
在建立的工程中添加lib.h和lib.cpp文件
/*lib.h*/
#ifndef LIB_H
#define LIB_H
extern "C" int _declspec(dllexport)add(int x,int y);
#endif
/*lib.cpp*/
#include "lib.h"
int add(int x,int y)
{
return x+y;
}
然后新建一个与DLL工程处于同一工作区的应用工程dllCall,它调用DLL中的函数add。
#include "stdafx.h"
#include "windows.h"
typedef int ( * lpAddFun)(int,int);
int main(int argc, char* argv[])
{
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);
}
return 0;
}
dllTest工程中的lib.h对函数add的声明前面添加了_declspec(dllexport)语句。这个语句的含义是声明函数add为DLL的导出函数。DLL内的函数分为两种:
一.DLL导出函数,可供应用程序调用;
二.DLL内部函数,只能在DLL程序使用,应用程序无法调用它们。
下面来分析DLL的调用。
首先,语句typedef int (* lpAddFun)(int ,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpAddFun的实例addFun;
其次,在函数main中定义了一个DLL HINSTANCE 句柄实例hDLL,通过WIn32 APi函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDLL;
再次,在函数main中通过WIn32 APi函数GEtProcAddress得到了所加载的DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add函数的调用。
最后,应用工程使用完DLL后,在函数main中通过Win32 APi函数FreeLibrary释放了已经加载的DLL模块。
通过这个简单的例子,我们获知的DLL定义和调用的一般概念:
一.DLL中需以某种特定的方式声明导出函数(或变量、类);
二.应用工程需以某种特定的方式调用DLL的导出函数(或变量、类)。