Snowming04's Blog
一颗红❤
Toggle navigation
Snowming04's Blog
主页
Cobalt Strike
Accelerated C++
区块链安全
友链
关于我
常用工具
代码积累
归档
标签
【Win32编程】C++ 编写 DLL 并调用(动态链接库)
? Windows编程 ?
2020-04-09 17:15:21
6039
0
0
snowming
? Windows编程 ?
工具: Visual Studio 2019 # 0x01 生成 dll 项目类型选:动态链接库(DLL)  项目结构:  头文件中: `framework.h` 不动,编辑 `pch.h`。 pch.h: ``` // pch.h: 这是预编译标头文件。 // 下方列出的文件仅编译一次,提高了将来生成的生成性能。 // 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 // 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 // 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 #ifndef PCH_H #define PCH_H // 添加要在此处预编译的标头 #include "framework.h" #endif //PCH_H extern "C" { _declspec(dllexport) int myAdd(int n, int m); _declspec(dllexport) int mySub(int n, int m); }; ``` 源文件中: `dllmain.cpp` 不动,编辑 `pch.cpp`。 pch.cpp: ``` // pch.cpp: 与预编译标头对应的源文件 #include "pch.h" #include<iostream> using namespace std; // 当使用预编译的头时,需要使用此源文件,编译才能成功。 int myAdd(int n, int m) { return n+m; } int mySub(int n, int m) { return n - m; } ``` 编译生成 dll: `生成`→`编译`,因为我是 Debug 模式下编译的,所以生成的 dll 在项目的 Debug 文件夹下:  >注:如果没有生成 dll,那就说明报错了。虽然看起来是编译成功。此时应该`调试`→`开始执行(不调试)`,查看报错。比如在我的这个情况中:  结果发现是我的源文件多加了一个空文件,没有包含`pch.h`头文件。于是我删去了这个空文件,重新`调试`→`开始执行(不调试)`就不报错了。重新编译在 Debug 文件夹下生成了 dll。 # 0x02 调用 dll 项目类型选:控制台应用  项目结构:  准备工作: 1、 在此项目文件夹下放入上个项目(`Dll2`)的以下四个文件:  2、 设置添加依赖项 参考此文:[VS2010怎样设置附加依赖项](https://jingyan.baidu.com/album/e8cdb32b5d679037052bad2b.html?picindex=1)  源文件中, testdll.cpp: ``` /*main*/ #include<iostream> #include"pch.h" using namespace std; int main() { int a = myAdd(5, 4); cout << a << endl; int b = mySub(5, 4); cout << b << endl; return 0; } ``` 运行成功!如下图:  -------------------------------- 【参考文档】 1. [DLL 导入和导出函数](https://docs.microsoft.com/zh-cn/cpp/c-language/dll-import-and-export-functions?view=vs-2019),微软官方文档 2. [从 DLL 导出](https://docs.microsoft.com/zh-cn/cpp/build/exporting-from-a-dll?view=vs-2019),微软官方文档
上一篇:
劫持安全狗更新服务进行权限维持
下一篇:
【Accelerated C++】课时10:管理内存和低级数据结构
0
赞
6039 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册