动态链接库的建立与调用(动态链接库)

 2024-01-17  阅读 9  评论 0

摘要:大家好,最近小红发现有诸多的小伙伴们对于动态链接库的建立与调用,动态链接库这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。1、打开VS2013,新建一个C++工程(不是MFC!),命名为 "mydll",接着选中 "DLL","导出符号",直接完成,如图:2、这时,看到的是默认初始化好了的代码,我们把一些不必要的删掉(其实那些是用来参考的,实际编写时删掉也无大碍)。3、然后在“

大家好,最近小红发现有诸多的小伙伴们对于动态链接库的建立与调用,动态链接库这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。

1、打开VS2013,新建一个C++工程(不是MFC!),命名为 "mydll",接着选中 "DLL","导出符号",直接完成,如图:

2、这时,看到的是默认初始化好了的代码,我们把一些不必要的删掉(其实那些是用来参考的,实际编写时删掉也无大碍)。

3、然后在“mydll.h”头文件里添加 下列代码:

4、extern "C" MYDLL_API int GetMaxNumber(int, int);

5、extern "C" MYDLL_API void ShowMsg(char *, char*);

6、在“mydll.cpp”源文件添加 如下图所示的功能实现代码:

7、OK!现在代码简简单单的写完了,那如何编译成 .dll 文件呢?

8、单击菜单栏 >"生成">"生成 mydll",编译成功。(注意,不是调试下的开始执行...)

9、然后找到工程的目录所在路径,DeBug目录下找到 那个生成的 “mydll.dll”(现在是不是很激动呢?!O(∩_∩)O)

10、接下来还有更重要的事情呢!

11、在重新修建一个工程,这次是一个C++下的控制台应用程序来测试编写的dll是否成功运行!!

12、工程名为“test_mydll”

13、添加一个.cpp源文件,添加如下代码:

14、(注意,要把 mydll.dll 放到 生成的.exe 同一目录下)

15、#include <windows.h>

16、全局...

17、typedef int( *pGetMaxN)(int, int);//定义一个函数指针类型

18、typedef void( *pShowMsg)(char *, char *);

19、main()...

20、//动态加载 dll

21、HMODULE hModule = LoadLibrary(L"mydll.dll");

22、if (!hModule)

23、{

24、cout << "Error!" << endl;

25、}

26、//获取函数 GetMaxNumber 的地址

27、pGetMaxN pgetm = (pGetMaxN)GetProcAddress(hModule, "GetMaxNumber");

28、cout << pgetm(10, 5) << endl;

29、//获取函数 ShowMsg 的地址

30、pShowMsg pshowm = (pShowMsg)GetProcAddress(hModule, "ShowMsg");

31、pshowm("内容", "标题");

32、//释放

33、FreeLibrary(hModule);

34、测试成功!!是不是很激动呢?!

35、这里要提醒一下哦,上面的是动态加载dll的,所以,就也是说,我们一直都没有使用原来的dll工程生成了那个“mydll.lib”的文件!

36、那么现在以静态调用dll 也是可行的,但 要把那个.lib文件和 .h头文件放到 与.cpp 同一个目录下(注意,这个不是.dll文件,所以可以放在 与.cpp同一个目录下!!!!)

37、然后,可以放心的吧以前动态调用的代码注释掉啦,添加新代码,看图吧

38、运行成功!

39、恩~~没错,编写dll到此大概基本上完成了,但是,一个动态链接库要在其他平台上也要能调用才算成功吧?!

40、所以,我在这里就用易语言测试下能不能成功的调用.....(⊙o⊙)…

41、一经测试,结果惨不忍睹,what?这究竟是为什么???为什么还会出现这个错误?这里我就不多说了...

42、既然这样,那就得找到解决的办法!

43、我用depends载入那个dll看了下,函数格式正常。那问题又出现在哪,最后我在原来的dll工程里添加了一个.def文件!

44、于是把连个函数导出去!再次编译!!

45、(如果仔细观察的小伙伴会发现,我在 头文件和源文件 多添加了个 _stdcall 这是调用约定,详细须百度...)

46、于是我再一次把 mydll.dll 放到和易语言源文件一个目录下,再次运行!现在,终于成功了!既然这样,在C++下还能调用成功吗?结果是可以的。

47、只是要稍微修改一下,也要加 _stdcall:

48、(要注意我写的注释,不要混淆了)

49、//动态

50、typedef int( _stdcall *pGetMaxN)(int, int);//定义一个函数指针类型

51、typedef void( _stdcall *pShowMsg)(char *, char *);

52、//静态

53、extern "C" __declspec(dllimport) int _stdcall GetMaxNumber(int, int);

54、extern "C" __declspec(dllimport) void _stdcall ShowMsg(char *, char*);

55、这样运行效果也是一样成功的!

56、总之,如果编写的dll文件中函数有 "_stdcall ",就必须把这个函数 添加到 .def 导出文件中!!!

57、要注意 那个.def 函数导出文件的强大!!

58、好了,至此结束了

以上就是动态链接库这篇文章的一些介绍,希望对大家有所帮助。

免责声明:本文由用户上传,如有侵权请联系删除!

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://www.sast-sy.com/eaa35BD0CBw1UVgwK.html

标签:动态链接库

发表评论:

管理员

  • 内容1434378
  • 积分0
  • 金币0

Copyright © 2022 四叶百科网 Inc. 保留所有权利。 Powered by ZFCMS 1.1.2

页面耗时0.0522秒, 内存占用1.74 MB, 访问数据库18次

粤ICP备21035477号