用vs2012添加一个生成动态链接库dll的项目,并使用之。
1.生成dll
1.1 创建dlltest空项目,设置属性,点击确定
1.2 添加头文件dlltest.h
#ifndef __DLLTEST__
#define __DLLTEST__
#ifdef __TESTEXPORT__
#define DLL_TEST_API __declspec(dllexport)
#else
#define DLL_TEST_API __declspec(dllimport)
#endif
extern "C" DLL_TEST_API void dlltest();
#endif
1.3 添加源文件dlltest.cpp
#include "dlltest.h"
#include <iostream>
void dlltest() {
std::cout << "dlltest" << std::endl;
}
1.4 dlltest项目增加宏
这样dlltest项目内的DLL_TEST_API就是dllexport(导出)的,而其它项目没有这个宏,就是dllimport(导入)的。
1.5 生成
编译会生成dlltest.lib,dlltest.dll
2.调用dll
新建一个win32项目main,增加main.cpp
2.1 隐式调用
需要.h,.lib,.dll三个文件,设置main项目的附加include,附加lib,并把.dll文件复制到目标目录下(生成的exe那个目录)
main.cpp代码如下
#include <iostream>
#include <cstdio>
#include "dlltest.h"
int main() {
std::cout << "hello world" << std::endl;
dlltest();
std::getchar();
return 0;
}
这种调用dlltest可以不声明为extern "C"
2.2 显式调用
只用.dll文件,把dll文件复制到目标目录下
main.cpp代码如下
#include <iostream>
#include <cstdio>
#include "dlltest.h"
#include <windows.h>
typedef void (*DllFunc)();
int main() {
std::cout << "hello world" << std::endl;
HMODULE hDll = LoadLibrary("dlltest.dll");
if (hDll != NULL) {
DllFunc pFunc = (DllFunc)GetProcAddress(hDll,"dlltest");
if (pFunc != NULL)
pFunc();
FreeLibrary(hDll);
}
std::getchar();
return 0;
}
这种方法要用到window api,且GetProcAddress只能说出C函数,所以要加extern "C",否则pFunc会为NULL运行结果