所谓静态链接库(Static Link Library),是在编译的链接阶段将库函数嵌入到应用程序的内部。但是如果多次调用,则该库函数会被调用多次,会极大的造成空间浪费以及链接器的负担(缺点)。它的优势在于,应用程序可以独立运行,因为在静态链接的时候已经将所需的组件都已经加载到了该应用程序中,不需要对应的DLL,但是应用程序比较大。
所谓动态链接库(Dynamic link library),与静态链接方式不同的是,它会将公用的库函数以及相关组件信息存放在一个地方,只是将地址信息告诉了链接器,只有在应用程序调用了该动态库之后才会加载到内存。其缺点是应用程序不能独立运行,需要在操作系统中安装对应的DLL以及运行环境。优点是生成的可执行文件很小。
接下来就开始上代码,首先我们要做的是生成一个dll。
这里我采用的是MFC生成DLL。我在这里采用的编辑器是VS2005来创建MFC动态库myTestDLL.dll。创建步骤已省。
在头文件myTestDLL.h里面添加代码部分:
#ifndef MYTESTDLL_H
#define MYTESTDLL_H
#include <iostream>
#ifndef FUN_API
#define FUN_API __declspec(dllexport)
#else
#define FUN_API __declspec(dllimport)
#endif
extern "C"
{
FUN_API int add(int,int);
FUN_API void msg(CString ,CString);
}
cpp文件里面添加实现部分:
FUN_API int add(int a,int b)
{
return a+b;
}
FUN_API void msg(CString str,CString str1)
{
MessageBoxW(NULL,str,str1,0);
}
然后直接运行生成即可。
接下来创建一个新工程来调用刚刚写好的dll,名字叫callMyTestDLL。
调用dll库有两种方法,首先我们来看一下动态调用
直接上代码:
头文件里面添加:
typedef int (__cdecl* pFun_add)(int,int);
typedef void (__cdecl* pFun_msg)(CString,CString);
注意:上面的调用约定__cdecl用错会报错,详细自己百度。
由于我创建的MFC工程,还需在类里面定义一下函数
pFun_add add;
pFun_msg msg;
以及实例:
HINSTANCE m_hInstance;
接下来cpp文件里面实现:
CString strDLL= L"myTestDLL.dll";
m_hInstance = LoadLibrary(strDLL);
if ( NULL == m_hInstance )
{
AfxMessageBox(L"LoadLibrary error");
return;
}
add = (pFun_add)GetProcAddress(m_hInstance,"add");
msg = (pFun_msg)GetProcAddress(m_hInstance,"msg");
add(201,309);
msg(L"121",L"111");
FreeLibrary(m_hInstance);
第二种调用:静态调用dll.
静态编译相对比较简单一点:需要的文件有三个:
动态库,静态库,头文件
将这三个文件拷到你的测试程序的路径下即可
调用程序cpp文件添加内容:
#include "myTestDLL.h"
#pragma comment(lib,"myTestDLL.lib")
接下来准备工作做好了,可以直接调用dll里面的函数了
add(123,345);
msg(L"121",L"111");