DLL是一个包含可由多个程序同时使用的代码和数据的库。
DLL文件就是把一些函数导出来,然后在新程序中进行复用的过程。
第一部分:使用Visual Studio 2010进行DLL的制作
生成方法一:
第一步:选择创建win32应用程序
第二步:在弹出的应用程序向导中做出如下选择:
第三步:在头文件添加Demoone.h
代码如下:
1 #ifndef _Demo_H_
2 #define _Demo_H_
3 #ifdef LIBDLL
4 #define LIBDLL extern "C" _declspec(dllimport)
5 #else
6 #define LIBDLL extern "C" _declspec(dllexport)
7 #endif
8 LIBDLL int Add(int plus1, int plus2);
9 #endif
添加Demoone.cpp
代码如下:
#include "Demoone.h"
int Add ( int a , int b )
{
return ( a + b );
}
结构视图如下:
然后点击“生成”下的“生成解决方案”即可
在项目目录下/debug/目录下存在DllDemoone.lib和DllDemoone.dll
生成方法二:
该方法不需要使用_declspec(dllimport)的方式,一二步与上同。
第三步:
Demotwo.h代码如下:
#ifndef _Demo_H_
#define _Demo_H_
extern "C" int Add (int a , int b);
#endif
Demotwo.cpp和上一步骤相同
第四步:
添加def文件:在“添加新建项”中左侧选择“代码”,新建一个模块定义文件,名字随意。它用来创建LIB文件内容如下:
LIBRARY "Dllmaketwo"
EXPORTS
Add @ 1
最终视图如下:
生成解决方案也能得到dll文件。
第二部分:使用dll文件
当我们的程序需要使用DLL时,就需要去加载DLL,在程序中加载DLL有两种方法,分别为加载时动态链接和运行时动态链接。
在加载时动态链接中,应用程序像调用本地函数一样对导出的DLL函数进行显示调用。要使用加载时动态链接,需要在编译和链接应用程序时提供头文件和导入库文件(.lib)。当这样做的时候,链接器将向系统提供加载DLL所需的信息,并在加载时解析导出的DLL函数的位置;
在运行时动态链接中,应用程序调用LoadLibrary函数或LoadLibraryEx函数以在运行时加载DLL。成功加载DLL后,可以使用GetProcAddress函数获得要调用的导出的DLL函数的地址。在使用运行时动态链接时,不需要使用导入库文件(lib)。
在实际编程时有两种使用DLL的方法,那么到底应该使用那一种呢?在实际开发时,是基于以下几点进行考虑的:
1、启动性能 如果应用程序的初始启动性能很重要,则应使用运行时动态链接;
2、易用性 在加载时动态链接中,导出的DLL函数类似于本地函数,我们可以方便地进行这些函数的调用;
3、应用程序逻辑在运行时动态链接中,应用程序可以分支,以便按照需要加载不同的模块。
方法一:加载时动态链接
新建一个普通控制台项目,将DLLDemoone.lib,DLLDemoone.dll以及Demoone.h复制到和项目代码相同的路径下:
代码按如下方式书写:
#include <iostream>
#include"Demoone.h"//方法a
using namespace std;
#pragma comment(lib, "DLLDemoone.lib")
//extern "C" _declspec(dllimport) int Add(int a, int b);//方法b
int main(int argc, char *argv[])
{
cout<<Add(2, 3)<<endl;
return 0;
}
运行即可获得正确的结果。
方法a和方法b是两种不同方式,若使用方法b则不需要拷贝Demo.h这个头文件。
方法二:运行时动态链接
新建一个普通控制台项目,将DLLDemoone.lib,DLLDemoone.dll以及Demoone.h复制到和项目代码相同的路径下:
#include <windows.h>
#include <iostream>
using namespace std;
typedef int (*AddFunc)(int a, int b);
int main(int argc, char *argv[])
{
HMODULE hDll = LoadLibrary("DLLmaketwo.dll");
if (hDll != NULL)
{
AddFunc add = (AddFunc)GetProcAddress(hDll, MAKEINTRESOURCE(1));
if (add != NULL)
{
cout<<add(2, 3)<<endl;
}
FreeLibrary(hDll);
}
}
在这里会碰到error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR”的问题,解决方式是将工程的字符方式进行修改即可