Windows下使用Dev C++ 编写dll与使用dll(二)C++项目下的dll
使用Dev c++,新建一个c++项目的dll项目。
还是会自动生成两个文件,只是这里不是.c文件,而是.cpp了。
这里,为了测试,我们分别在cpp与h文件中像之前C项目一样,添加一个HelloWorld函数,与一个add函数。
其他的,我们先啥也不管。直接编译运行。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | /* Replace "dll.h" with the name of your header */ #include "dll.h" #include <windows.h> DllClass::DllClass() { } DllClass::~DllClass() { } void DllClass::HelloWorld() { MessageBox(0, "Hello World from DLL!\n" , "Hi" ,MB_ICONINFORMATION); } DLLIMPORT void HelloWorld() { MessageBox(0, "Hello World from DLL!\n" , "Hi" ,MB_ICONINFORMATION); } DLLIMPORT int add( int a, int b) { return a+b; } BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: { break ; } case DLL_PROCESS_DETACH: { break ; } case DLL_THREAD_ATTACH: { break ; } case DLL_THREAD_DETACH: { break ; } } /* Return TRUE on success, FALSE on failure */ return TRUE; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #ifndef _DLL_H_ #define _DLL_H_ #if BUILDING_DLL #define DLLIMPORT __declspec(dllexport) #else #define DLLIMPORT __declspec(dllimport) #endif class DLLIMPORT DllClass { public : DllClass(); virtual ~DllClass(); void HelloWorld(); }; DLLIMPORT void HelloWorld(); DLLIMPORT int add( int , int ); #endif |
编译运行,打开文件夹,查看。
生成了dll_demo.dll。我们还是像之前一样,使用test.cpp来引入这个dll中的函数。
dll调用成功,但是居然没有弹出一个MessageBox。哪里有问题呢?
再来看看add函数。
仍然是调用成功,运行卡顿,而且返回非0数值,也却无法调用add函数,这是为什么呢。
依照本人粗浅的理解:大体就是c++项目生成的dll,会重新给函数、类命名。
具体可以看刚才文件夹下的.def文件。我们打开看看。(以打开文本方式打开即可,这里安利一款非常好用的空格预览工具QuickLook,选择文件,按下空格,即可预览)
这是这个dll的导出表,很明显,并没有单独的add。
实际上,之前C项目生成dll文件也是有这个文件的,大家可以自行对比,只是C项目生成dll不会导致函数重命名,就不做详叙。
这里可见,HelloWorld函数已经重命名为“_Z10HelloWorldv”。我们还是在test.cpp中试试。
点击确定,程序便返回正常的0了。
那么,如何才能不让函数名发生变化呢?如下:
我们同时改动这两个文件,cpp文件,随便删除分号,再填上就好,.h文件如下:
重新编译运行生成dll。
再次查看def文件。
类且不管,我们需要用到的HelloWorld与add函数都恢复了,在test1.cpp中测试一下。
ok的,可以正常使用。
要查看dll中的函数方法,可以使用dumpbin.exe,这个是什么,需要自行摸索,这里仅提及一下。
以及使用步骤:
打开dumpbin.exe文件夹,进入cmd命令行。dumpbin /exports C:\hello.dll。即可查看。
显然,后面是一个绝对路径,因为没有必要把一个dll复制到其文件夹下进行查看。
具体如何使用,就需要参考其他文章了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律