要创建动态链接库文件(dll),就要先建立一个动态链接库工程。vs下就是建立一个win32 Console Application(win32 控制台应用工程),然后设置application setting为dll。这样就建立了一个dll的工程。
在工程中建立一个头文件并对应建立一个源文件。在头文件中放入函数的声明,包括要导出的接口函数(即能被调用该dll的程序使用的函数)。
如:
头文件 Antspro_QT.h
#include <string>
using namespace std;
#ifndef ANTSPRO_QT_H
#define ANTSPRO_QT_H
extern "C"{
__declspec(dllexport) void __cdecl print(const char* msg);
};
#endif
这样就声明了该dll的一个导出接口函数为print,接受一个常量字符创的值。
然后在对应的源文件中定义该函数的实现(注意包含stdafx.h头文件)
如:
#include "stdafx.h"
#include "Antspro_QT.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
extern "C" __declspec(dllexport) void __cdecl print(const char *msg)
{
cout << msg << endl;//author CSDN iaccepted 凌风
}
然后编译一下工程,就会在工程目录下的debug或者release(根据个人选择)文件夹下找到Antspro_QT.dll和相应的Antspro_QT.lib两个文件
如上图的第一个和最后一个,然后把这两个文件拷贝出来放到要使用的工程下的目录中,在最后发布的时候别忘了将dll文件拷贝的release文件夹下。
然后就是在项目中使用该dll文件,方法也很简单,主要是加载一下该dll然后获得其中的接口函数,然后就可以像使用本地函数一样使用该dll中的函数了。
typedef void(*pfunc)(const char *);
void test(){
HINSTANCE hDll;
hDll = LoadLibrary("Antspro_QT.dll");
pfunc print = (pfunc)GetProcAddress(hDll, "print");
print("hello world!\n");
}
使用如上,HINSTANCE是定义在windows.h头文件中的宏,通过LoadLibrary来获得该dll文件的句柄,然后同过GetProcAddress函数来获得暴露的接口函数的函数指针,然后就可以像使用本地函数一样使用该函数的功能了。上面的一句typedef是定义了一个函数指针类型,该类型名为pfunc为一个函数指针,指向一个参数为const char *返回值为void的函数。
Ok,上面就是一个dll文件的创建和使用全过程。