#生成dll
前提
- vs2017
过程
- 新建一个项目->windows桌面->windows桌面向导(网上很多文章都是从控制台应用程序开始,之前的版本可以2017做了相应的更改)
- 在工程中添加类 在.h中写如下
#pragma once
#define MYLIBAPI extern "C" __declspec( dllexport )
extern "C" __declspec(dllexport) int panny(int i, int(*call_back)(int a, int b));
__declspec(dllexport) int sum(int a, int b);
-
extern "C“以C的格式 导出,不加也是可以运行的,define只是一种编程风格
-
在对应的.cpp中实现 ,一般你写在.h中的方法 会提示你在.cpp中实现确定一下就会生成对应的方法框架
-
这种方式生成的dll可能会造成函数名的更改,如果不怕麻烦可以查一下更改后的函数名然后使用对应的名子一样可以。
-
还可以通过def文件来更改文件名和函数顺序。切记一定要在链接器->输入->模版定义文件中添加对应的文件
-
添加资源文件->添加对应的版本资源文件
调用
- 动态调用
int a = 5, b = 3;
HINSTANCE hInst = LoadLibraryA("DllTest.dll");
typedef int(*pFun)(int, int);//定义一个函数指针类型pAdd
pFun add = (pFun)GetProcAddress(hInst, "sum");
cout << a << " + " << b << " = " << add(a, b) << endl;
cin >> a;
return 0;
- 静态调用
- 在链接器->常规->附加器目录添加lib文件的文件夹
- 在链接器->输入->输出文件添加对应的文件名
//extern int sum(int, int); //告诉编译器,add函数是在该源文件外部定义的函数
_declspec(dllimport) int sum(int, int);//告诉编译器,sub函数是从动态库导入的函数
//这两种方式都可以正常的调用,但是下面的相对来说加载的更快一些
int main()
{
int a = 5, b = 3;
cout << a << " + " << b << " = " << sum(a, b) << endl;
cin >> a;
return 0;
}