DLL(动态链接库),按名取意是动态链接的库。但dll分动态链接和静态链接。
静态链接的意思是以lib作为导出函数头加载dll,这样的动态库加载编译後,执行程序的初期就判断是否用dll文件
/*test.cpp*/
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
EXPORT long sum(int a, int b)
{
return a+b;
}
#ifdef UNICODE
以上类似的代码在编译的时候会生成一个lib文件来包含dll的函数名
调用方式如下
#pragma comment(lib, “test.lib”)//lib库文件
#ifdef __cplusplus
#define IMPORT extern "C" __declspec (dllimport)
#else
#define IMPORT __declspec (dllimport)
#endif
EXPORT long sum(int a, int b);
之后,在下面的程序按照普通函数调用即可。
另一种是动态使用dll,这种方式是当程序使用dll时才判断是否用此动态库文件。这种方法也适用于丢失lib文件的dll,
/*调用动态dll*/
typedef long(__cdecl *TESTDLL)(int a, int b);
HINSTANCE hmod;
/*调入动态库*/
hmod = ::LoadLibrary("test.dll");
if (hmod == NULL)
{
AfxMessageBox("Fail");
}
TESTDLL lpproc;
lpproc = (TESTDLL)GetProcAddress(hmod, "sum");
if (lpproc != (TESTDLL)NULL)
{
/*执行动态库中的函数*/
long result = (*lpproc)(cd)(1, 2);
result存储的就是计算的结果。
}
FreeLibrary(hmod);
}
以上仅针对两种形态进行解读,并没有涉及到深层次的资源等东西。
我的臆想是这样,在自己做程序的时候,比如学习程序设计的时候,可以使用动态加载,这样会节省内存资源。而在给公司做的时候,尽量用lib连接的方式,因为客户可能误删dll文件,在程序初始化时候提示错误比使用一段时间后弹出错误要好吧。