动态库dll
dll生成:
在dllDemo.h头文件中如下定义:
为了能找到dll的函数地址,生成dll时需要将其中的函数声明为C函数(extern "C")
原因:
一般来讲,在DLL编程过程中,对于导出的函数前 都需要加入 extern “C”,
extern 表示这是个全局函数,可以供各个其他的函数调用;
“C” 表示编译时按照 C编译器的方式进行编译,而不是C++。 C++的编译方式考虑了函数重载,所以对函数名进行了新的修饰,产生了所谓的破坏性命名。
__declspec(dllexport) 参见:https://www.cnblogs.com/slysky/p/10560081.html
#pragma once extern "C" __declspec(dllexport) int Add(int x, int y);
在cpp文件中实现Add函数时:
#include "dllDemo.h"
int Add(int, int)
{
return x + y;
}
配置生成的文件(dll、lib)路径:
dll: 链接器-->常规-->输出文件
lib: 链接器-->高级-->导入库
dll使用方法:(隐式加载、显式加载)
1.隐式加载
a.项目中配置好.h、.lib的路径
#include <iostream>
#include "dllDemo.h"
using namespace std;
extern int Add(int, int);
int main()
{
int sum = Add(1, 1);
cout << sum << endl;
return 0;
}
b.生成exe
b.将dll拷贝至exe路径下
d.运行exe
2.显式加载(只需要dll文件,不需要.h和.lib)
#include <iostream>
#include <windows.h>
using namespace std;
typedef int(*FUNCADDR) (int, int);
int main()
{
HINSTANCE dllDemo = LoadLibrary("dllDemo.dll");
FUNCADDR Add;
if (dllDemo)
{
Add = (FUNCADDR)GetProcAddress(dllDemo, "Add");
int sum = Add(1,1);
cout << sum << endl;
}
return 0;
}
编译报错:
Error C2664:无法将参数 1 从“const char [12]”转换为“LPCWSTR”
原因:
当前工程只支持Unicode字符,不支持多字节,此时如果代码中出现多字节字符串, 就会报错。LoadLibrary 函数有两个版本,一个LoadLibraryW 针对Unicode版的,一个是LoadLibraryA 针对Multi-Byte(多字节)版的
解决方法:
项目属性->常规->字符集->使用多字节字符集


浙公网安备 33010602011771号