如何加载动态库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.内存浪费。