越来越多的编程爱好者倾向于创建自己的动态链接库,因其用途十分广泛。作为一名编程爱好者,掌握动态链接库的编写技巧至关重要,这是不可或缺的一部分。
1、 启动VS2013,新建C++项目(非MFC),命名mydll。选择DLL类型,勾选导出符号,按图示完成设置。


2、 此时,映入眼帘的是已默认初始化的代码,我们可以删去一些非必要的部分,那些内容仅作参考,实际编码时删除并无影响。
3、 接下来,在mydll.h头文件中添加以下代码:
4、 在mydll.cpp源文件中添加所示的功能实现代码:



5、 现在代码已经简单写好了,接下来该如何编译生成.dll文件?
6、 点击菜单栏生成中的生成 mydll选项,编译即可成功(切记,不要选择调试下的开始执行)。
7、 接着,定位到工程目录路径,在DeBug文件夹中查找生成的mydll.dll文件(此刻是不是很兴奋?!O(∩_∩)O)
8、 后面还有更关键的事等着!

9、 重新构建一个C++控制台应用,用于测试编写好的dll是否能成功运行。
10、 工程名称为test_mydll

11、 新增一个.cpp源文件,加入以下代码:
12、 请注意,需将mydll.dll放置于生成的.exe文件同一目录下。
13、 全面规划未来
14、 typedef int (*pGetMaxN)(int, int); 表示定义一个指向函数的指针类型,该函数接收两个int参数并返回int值。
15、 通过代码实现dll的动态加载
16、 {
17、 }
18、 获取函数 GetMaxNumber 的地址,用于后续调用操作。
19、 获取函数 ShowMsg 的地址以便后续调用使用。
20、 展示内容于标题之下。
21、 请放行
22、 测试成功!你是否感到无比激动?


23、 需要注意的是,上述内容涉及动态加载dll的方式。也就是说,我们始终没有用到最初dll工程生成的mydll.lib文件!
24、 目前,静态调用dll的方式也是可行的。只需将对应的.lib文件和.h头文件放置在与.cpp文件相同的目录中即可(请注意,这不是.dll文件,因此可以与.cpp文件放在同一目录下)。

25、 之后,便可将之前动态调用的代码注释掉,添加新代码,具体情况请参考图示。
26、 执行完毕!


27、 编写dll至此基本完成,但要使动态链接库在其他平台也能调用,才算真正成功。
28、 因此,我在此用易语言测试能否成功调用……
29、 测试后,结果令人震惊:为何会出现这种错误?这里就不详细解释了……

30、 既然如此,就必须找到解决办法!
31、 我用depends载入dll查看,函数格式无误。问题究竟出在哪里?最终,我在原dll工程中添加了一个.def文件。
32、 然后将这两个函数导出,重新编译即可。
33、 细心的小伙伴可能会发现,我在头文件和源文件中额外加了_stdcall,这是调用约定,想了解详情请自行百度。





34、 我再次将mydll.dll置于易语言源文件同一目录下,重新运行后终于成功。那么,在C++环境下是否也能调用成功?事实证明,完全可以实现调用。
35、 只需稍作修改,并添加_stdcall即可。
36、 实时更新动态
37、 typedef int(_stdcall *pGetMaxN)(int, int); 定义了一种函数指针类型,用于指向特定签名的函数。
38、 保持静止状态
39、 这样运行同样能成功!


40、 若DLL函数含_stdcall,必须将其添加到.def导出文件中,否则无法正常使用!
41、 请注意,.def函数导出文件非常强大!
42、 至此,一切已经结束。