如何加载动态库dll
1.隐式链接(。dll,。lib,。h必需)
2.显式链接(。dll,。h必需)
方法1:隐式链接-要求。lib,。dll,。h文件。
隐式链接是在程序开始执行时将DLL文件加载到内存中,而显示链接是实时加载,程序需要时加载,不需要时卸载。
这个方法需要DLL文件,以及相应的Lib文件和头文件。
只要在程序中没有显式链接,就是隐式链接。
Windows程序的bin目录包含可执行文件(。exe)和动态链接库(。dll),lib目录包含静态库。
步骤
第一步:把。dll,lib和。h文件放入相应的搜索路径。
点击这里查看动态库的搜索路径,记住最重要的两条。
1,项目的当前目录(。cpp)目录
2.path环境变量中的目录
●静态库搜索路径包括
1,项目的当前目录。cpp目录(项目和解决方案的调试不可用)(它也不是解决方案目录)。
2.VC设置中的库目录。
注意:如果lib库没有放在搜索路径中,也可以添加到程序中。
# pragma comment (lib," d:/dlltest . lib))//如果是相对路径,则为当前路径。项目的cpp目录。
●头文件搜索路径包括
1,包含目录(包含?目录)
第二步:一定要在VC设置里把你用的库的名字加到依赖项里。
第一种类型(对应以上各条搜索路径1):针对少量库。
设置。dll,。lib搜索路径:直接放。dll,。lib,。h放入项目的当前目录(即包含项目源文件的目录。cpp)。
设置的搜索路径。h:包含目录(包含?目录)添加您的。h路径。
然后在链接-& gt;输入->;将您想要使用的静态库添加到附加依赖项中。
这里只添加了静态库。
您可以使用DLL中的函数。
第二种类型(对应于上面的每个搜索路径2):针对相对大量的库(Opencv)。
OpenCV和OSG等开源库的配置。
这种方法也是开源库的常用配置方法,如Opencv、OSG等。
步骤如下
步骤1。添加DLL的目录。
方法1: ★将dll目录(通常是bin目录)放入环境变量path(需要重启),Path是搜索动态库的目录。
第二步。添加静态库lib库目录和头文件目录。
将静态库目录和头文件目录添加到项目中的VC++目录中。
第三步。添加静态库
在链接上-& gt;输入->;将您想要使用的静态库添加到附加依赖项中(当在程序中调用时,您将在上面配置的库目录中查找这个库)。
这里只添加了静态库,动态库的目录已经放入环境变量中。系统将搜索该路径并自动加载。dll。
如rmwroadboundarytrealtlinedll . lib。
然后,在程序中添加一个头文件(在上面配置的头文件目录中找到),就可以使用DLL中的函数了。
方法2:显式链接-需要一个DLL(没有. lib。h文件)。
是显式加载DLL库
注意:在显示链接和导出DLL时,应该采用Extern“C”的方式,而不是_declspec(dllexport),因为_declspec(dllexport)会有“名称适配”的问题(使用_cdecl调用规范的C++编译方式)。
示例:
例如,对应于库文件的头文件如下
#ifndef DLLTEST_H
#已定义测试_H
//此宏是使用DLL项目内的_ _ declspec (dllExport)导出的。
//在dll项目外部使用时,使用__declspec(dllimport)将其导入。
//宏DLL_EXPORTS是在。cpp。
#ifdefDLL_EXPORTS
#defineDLL_EXPORTS?extern"C"_declspec(dllexport)
#否则
#定义DLL_EXPORTS?extern"C"_declspec(dllimport)
#endif
//函数声明
DLL_EXPORTSint?Add(int a,int b);
DLL_EXPORTSint?Sub(int a,int b);
DLL_EXPORTSint?Divide(int a,int b);
#endif//DLLTEST_H
测试代码:
typedefint(*Add)(int a,int b);
typedefinit(* Sub)(int a,int b);
HINSTANCE hDLL
Add Add _;//函数指针
hDLL = LoadLibrary(_ T(" D:/dlltest . dll "));//加载动态链接库DLLTest.dll文件;
Add_ = (Add)GetProcAddress(hDLL," Add ");
intresult = Add_(5,8);
printf("5+8:%d\n ",result);
免费图书馆(hDLL);//卸载。dll文件;
以下内容是由__declspec(dllexport)导出的,不建议这样做。请注意函数名的写法!
现在DLLTest.h中有函数了(由__declspec(dllexport)导出)。
#ifndef DLLTEST_H
#已定义测试_H
//此宏是使用DLL项目内的_ _ declspec (dllExport)导出的。
//在dll项目外部使用时,使用__declspec(dllimport)将其导入。
//宏DLL_EXPORTS是在。cpp。
#ifdefDLL_EXPORTS
#defineDLL_EXPORTS?__declspec(dllexport)
#否则
#定义DLL_EXPORTS?__declspec(dllimport)
#endif
intDLL_EXPORTS Add(int a,int b);
intDLL_EXPORTS Sub(int a,int b);
intDLL_EXPORTS Divide(int a,int b);
#endif//DLLTEST_H
试验码
typedefint(*Add)(int a,int b);
typedefinit(* Sub)(int a,int b);
HINSTANCE hDLL
Add Add _;//函数指针
//也可以使用hdll = loadlibrary(_ t(" d:/dlltest . dll "));
hDLL = loadlibrary a((" D:/dlltest . dll "));//加载动态链接库DLLTest.dll文件;
Add_ = (Add)GetProcAddress(hDLL,"?加@ @ YAHHH @ Z ");//!!!!获取函数地址
intresult = Add_(5,8);
printf("5+8:%d\n ",result);
免费图书馆(hDLL);//卸载。dll文件;
这里要注意的是:GetProcAddress(hDLL,“函数名”);中的函数名是DLL中的函数名,PE Explorer软件可以查看。
因为VC++是用来处理函数名的,所以
GetProcAddress(hDLL,"?加@ @ YAHHH @ Z ");// GetProcAddress(hDLL,“函数名”);
而不是简单的“添加”,因为DLL中的函数名是用VC++的方式处理过的函数名。
显示调用,最好以Extern“C”的形式导出DLL。
所以在采用隐式链接方式时,只加载需要的DLL,在附加依赖项中,只将需要的DLL添加到lib中,而不是更多,否则会造成1。增加程序启动时间。2.内存浪费。