DLL的编写与使用(C++)

DLL可以理解为具有一定功能的可以嵌入到可执行程序中的程序片段。

与lib文件一样,DLL在VS中可以有两种编译方式:C编译、C++编译。个人感觉动态加载DLL文件,使用DLL内部函数的时候倒都是一样的。

一、C编译方式。

A:dll的生成

1 //File of "sub.h"
 2 #ifndef SUB_H
 3 #define SUB_H
 4 extern "C" int __declspec(dllexport)sub(int x, int y);
 5 #endif
 6 
 7 //File of "sub.cpp"
 8 #include"sub.h"
 9 int sub(int x, int y)
10 {
11     return x-y;
12 }

B:dll的使用(动态调用)

1 #include<Windows.h>
 2 typedef int(*lpAddFun)(int, int);
 3 
 4 int main()
 5 {
 6     HINSTANCE hDll;
 7     lpAddFun subFun;
 8 
 9     hDll = LoadLibrary(TEXT("..\\DLL\\DLL_study2.dll"));
10     subFun = (lpAddFun)GetProcAddress(hDll,"sub"/*"?sub@@YAHHH@Z"*/);
11     int x = subFun(3,8);
12     FreeLibrary(hDll);
13 
14     return 0;
15 }

注意问题:如果在生成的时候"sub.h"不加extern "C"那么按照C++的方式编译,编译完成后函数的名字按照C++的方式改写(mangled name)。当动态调用的时候语句 subFun = (lpAddFun)GetProcAddress(hDll,"sub"/"?sub@@YAHHH@Z"/); 按照sub就找不到sub函数了。但是按照注释的名字可以。(C++编译的时候将sub函数的名字改成那样了。)也就是说,只要GetProcAddress函数第二个参数(要找的函数名字)与编译生成后的名字一致就行了(不管DLL是什么方式编译成功的)。(很诡异的事情是:当生成了dll后用dependency查看的时候,如果release版本在生成的地方看怎么都是C编译的方式,但是把dll复制到其他地方就该是什么方式就什么方式了。可能是dependency有记忆功能,我前后试过几次他看是一样的文件名就没更改了。)

二、生成DLL的时候使用.def文件。

这样做的时候"sub.h"文件就不用extern “C" 和 __declspec(dllexport)这些东西了。

LIBRARY

EXPORTS

sub @ 1

函数名字就规定为sub了。编译方式貌似是C的(不敢确定dependency 的结果啊!)不过不管是哪种方式函数名字肯定是确定了的啦。

原文链接: https://www.cnblogs.com/jiangyoumiemie/p/3219121.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/97412

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月10日 上午4:14
下一篇 2023年2月10日 上午4:15

相关推荐