c++动态以及静态调用dll
来源:互联网 发布:2010科比总决赛数据 编辑:程序博客网 时间:2024/06/02 07:00
原创博客:http://blog.csdn.net/ojshilu/article/details/12954957
C++调用dll链接库的方式有两种:动态调用(又叫显示调用)、静态调用(又叫隐式调用)。
一、静态调用dll
静态调用,又称隐式调用。由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码,Windows操作系统会负责控制DLL导入内存的次数。这种调用方式简单,能够满足通常的要求。通常采用的方法是把产生动态连接库时产生的.LIB文件(函数入口位置文件)加入到应用程序的工程中,想使用DLL中的函数时,只须在源文件中声明一下。
LIB文件包含了每一个DLL导出函数的符号名和可选择的标识号以及DLL文件名,不含有实际的代码。Lib文件包含的信息进入到生成的应用程序中,被调用的DLL文件会在应用程序加载时同时加载在到内存中。
具体方法:
1、在使用链接库的代码开头加入,第二行是要调用的链接库里的函数:
#pragma comment(lib,"mydll.lib")
extern "C" __declspec(dllimport) int hello(int);
2、将要调用的链接库的lib放入项目源代码中,然后编译。(编译的时候不需要dll。这里把静态部分lib编译进了exe,但动态库dll还没用。)
3、运行之前要把dll放到exe目录下。
二、动态调用dll
动态调用,即显式调用,是由编程者用API函数加载和卸载DLL来达到调用DLL的目的,比较复杂,但能更加有效地使用内存。在Windows系统中,与动态库调用有关的函数包括:
①LoadLibrary(或MFC 的AfxLoadLibrary),装载动态库。
②GetProcAddress,获取要引入的函数,将符号名或标识号转换为DLL内部地址。
③FreeLibrary(或MFC的AfxFreeLibrary),释放动态链接库。
具体方法:
1.声明头文件<windows.h>。
2.然后用typedef定义一个指针函数类型,typedef int(*fun)(int) 。这个指针类型,要和你调用的函数类型和参数保持一致。
3.定义一个句柄实例,用来取DLL的实例地址。HINSTANCE hdll。格式为hdll=LoadLibrary(“DLL地址”);这里字符串类型是LPSTR,当是unicode字符集的时候会不行,因此要在配置-属性-常规里面把默认字符集“unicode”改成支持多字符扩展即可。
4.取的地址要判断,返回的句柄是否为空,如果为无效句柄,那么要释放加载DLL所占用的内存。FreeLibrary(hdll);
5.然后定义一个函数指针,用来获取你要用的函数地址。
先是定义一个函数指针 fun FUN;然后通过GetProcAdress来获取函数的地址,参数是DLL的句柄和你要调用的函数名:比如:FUN=(fun)GetProcAdress(hdll,"hello")。这里也要判断要函数指针是否为空,如果没取到要求的函数,那么要释放句柄。
6.然后通过函数指针来调用函数。FUN(int count);这里不能用函数名来使用函数,因为这个DLL本身不是当前CPP的一部分,而是通过windows去调用.没有在这个工程里声明或者定义,而是暴露出一个头,要指针获取他的地址,通过指针来调用。
代码:
[cpp] view plain copy
#include <stdio.h>
#include <Windows.h>
typedef int(*dllfun)(int); //定义形式对应的函数指针类型
int main()
{
int a = 2;
dllfun lucky; //声明一个函数指针
HINSTANCE hdll;
hdll = LoadLibrary("mydll.dll");
if(hdll == NULL)
{
printf("无法载入dll\n");
FreeLibrary(hdll);
getchar();
return 0;
}
lucky = (dllfun)GetProcAddress(hdll,"lucky");
if(lucky == NULL)
{
printf("无法获取函数地址\n");
FreeLibrary(hdll);
getchar();
return 0;
}
int b = lucky(a);
printf("%d\n",b);
FreeLibrary(hdll);
getchar();
return 1;
}
阅读全文
0 0
- c++动态以及静态调用dll
- dll 调用,动态,静态
- 动态调用、静态调用dll
- Delphi DLL的创建、静态 以及动态调用
- vb.net静态动态调用c++dll的方法
- C# 中静态调用C++dll 和C# 中动态调用C++dll
- 动态和静态调用DLL
- DLL静态和动态调用
- (二)新建dll以及静态调用dll
- C函数的dll,C++静态调用以及C++函数的C++静态调用。
- [C-C++]DLL之旅2 : 调用DLL(静态&动态加载)
- C调用C++动态库以及静态链接库
- (三)新建dll以及动态调用dll
- bcb平台的C++dll的静态调用法和动态调用法的方法
- bcb平台的C++dll的静态调用法和动态调用法的方法
- C#动态调用C++DLL
- MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用
- MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用
- Apache Tomcat 信息泄露及远程代码执行漏洞分析与防护
- 剑指offer--调整数组顺序使奇数位于偶数前面
- Redis安装(CentOs版本),及项目引用
- Java时间--毫秒转换成特定格式
- 数的全排列
- c++动态以及静态调用dll
- 474 Magry的朋友很多
- 怎么运用PDF Transformer+实现文本到PDF的添加
- Java--JDBC,CRUD,Unit
- mysql多实例组复制配置
- 最小堆获取topK问题与堆的增删
- linux下添加动态链接库路径的方法
- 自动化测试框架GTest安装
- (spring redis第二章)Spring+Redis+Nginx实现不同服务器下的Session共享