动态链接库的使用方法
来源:互联网 发布:逆战ak12淘宝有cdk吗 编辑:程序博客网 时间:2024/06/05 04:20
动态链接库加载的两种方法
1.隐式链接
2.显示加载
一.隐式链接
创建Win32 Dynamic-Link Library程序Dll1
Dll1.cpp文件
#define DLL1_API extern "C" _declspec(dllexport)//用了extern "C"就不能导出类了,只能导出全局函数#include "Dll1.h"#include <windows.h>#include <stdio.h>int add(int a, int b){return a+b;}int subtract(int a, int b){return a-b;}/*void Point::output(int x, int y){//该函数在调用者窗体上输出x与y的值HWND hwnd = GetForegroundWindow();//获取客户当前调用窗口的句柄HDC hdc = GetDC(hwnd);char buf[20];memset(buf,0,20);sprintf(buf,"x=%d,y=%d",x,y);TextOut(hdc, 0, 0, buf, strlen(buf));ReleaseDC(hwnd, hdc);}*/
Dll1.h文件
#ifdef DLL1_API#else// 此处extern "C"是给客户端使用的表明导出的函数名字不改变//如果不加extern "C",C++会按照它的规则改变函数名字,那样用C写的客户端就找不到该函数了//但是,加上extern "C"只能导出全局函数了 所以注释了导出类#define DLL1_API extern "C" _declspec(dllimport)#endif/*_stdcall表示为标准调用约定。如果不加_stdcall函数为C调用约定。delphi就为_stdcall(标准调用约定).但用_stdcall声明后,函数名会改变,如何导出原函数名请看第二节。二.显示加载(动态链接)DLL1_API int _stdcall add(int a, int b);DLL1_API int _stdcall subtract(int a, int b);*/DLL1_API int add(int a, int b);DLL1_API int subtract(int a, int b);//在类名前加上_declspec(dllimport)声明,可以导出类/*class DLL1_API Point{public:void output(int x, int y);};*///如果不想导出整个类只需在类的成员函数前面加上_declspec(dllexport)声明(但访问权限必须是public)。//此头文件应写成/*class Point{public:DLL1_API void output(int x, int y);void test();};*//*此头文件既可以给dll源文件使用也可以给调用dll的客户端程序使用。dll源文件使用时,在Dll1.cpp文件中定义#define DLL1_API _declspec(dllexport),表示为导出。在客户端程序调用时,定义#define DLL1_API _declspec(dllimport),表示导入*/
Dll1.dll测试如下:
1.建立MFC AppWizard(exe)测试程序Test。
2.编译Dll1程序成功后,会生成Dll1.dll文件和Dll1.lib文件,把Dll1.dll文件和Dll1.lib文件复制到测试文件下。
3.Test程序中,点击Project->seeting->Link 在Object/library modules:下把.lib文件名写上。此时为Dll1.lib
4.在Test程序的Dialog上添加两个按钮。响应函数分别如下
void CTestDlg::OnBtnadd() {// TODO: Add your control notification handler code hereCString str;str.Format("5+3=%d", add(5,3));MessageBox(str);}void CTestDlg::OnBtnsubtract() {// TODO: Add your control notification handler code hereCString str;str.Format("5-3=%d", subtract(5,3));MessageBox(str);}5.别忘记在Test的源程序里调用Dll1.h,此头文件声明了从dll中导入的函数。
二.显示加载(动态链接)
创建Win32 Dynamic-Link Library程序Dll2
Dll2.cpp文件//_stdcall为标准调用约定。因为有def文件所以导出函数不会改变名字int _stdcall add(int a, int b){return a+b;}int _stdcall substract(int a,int b){return a-b;}
在Dll2工程文件夹内建立Dll2.def文件
LIBRARY Dll2EXPORTSaddsubstract
测试Dll2.dll如下:
1.把Dll2.dll文件复制到Test程序文件夹下
2.按钮响应函数如下
//动态加载不需要.lib与头文件。只需要DLL文件HINSTANCE hInst;hInst = LoadLibrary("Dll2.dll");//加载动态链接库typedef int (_stdcall *ADDPROC)(int a, int b);//定义函数指针类型,用来接收函数地址//获取指定导出的动态链接库的地址//ADDPROC Add = (ADDPROC)GetProcAddress(hInst, "add");//通过函数名调用动态链接库导出的函数(首选,能保证不出错)ADDPROC Add = (ADDPROC)GetProcAddress(hInst, MAKEINTRESOURCE(1));//通过序号调用动态链接库导出的函数if (!Add){MessageBox("获取函数地址失败!");}CString str;str.Format("5+3=%d", Add(5,3));MessageBox(str);FreeLibrary(hInst);//减少加载动态链接库的引用计数。释放动态链接库
注:查看动态链接库导出的函数可用dumpbin命令。 在cmd中进入到该dll目录,(如该dll名称为dll1.dll)敲入命令:
dumpbin -exports dll1.dll
注:查看可执行程序(.exe程序)导入的函数可用dumpbin命令。 在cmd中进入到该exe程序目录,(如该exe名称为test.exe)敲入命令:dumpbin -imports test.exe
- 动态链接库的使用方法
- linux下动态链接库的使用方法
- C++ DLL动态链接库的使用方法
- 动态链接库使用方法总结
- 动态链接库使用方法总结
- 静态链接库、动态链接库使用方法
- MFC动态链接库的制作步骤和使用方法
- MFC动态链接库的制作步骤和使用方法
- Linux动态链接库.so的使用方法及代码优化
- MFC动态链接库的制作步骤和使用方法
- linux 动态链接器的使用方法
- Linux系统动态链接库和静态链接库CMake的使用方法
- 动态链接库dll的使用方法——动态加载dll
- 动态库的使用方法
- c++基础4:c++工程的动态链接库dll的导出使用方法
- 【转】gcc动态链接库*.so文件的生成与使用方法
- 【转】gcc动态链接库*.so文件的生成与使用方法
- 动态链接库DLL的链接
- VMware三种网络配置方式
- Oacle 如何强制刷新Buffer Cache
- S3C6410启动模式介绍
- Android蓝牙API之BluetoothAdapter类
- 江苏镇江江堤一个月内第二次出现垮塌-决堤-坍塌-非法采砂
- 动态链接库的使用方法
- 指向void的指针
- 编译器错误消息: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\yami
- 在升序数组中选取2个数,使其和等于一个输入数字n
- vs2010快捷键-- 摘
- JSP中获取session
- log4j.properties相关配置(1)
- java 反射之自定义注解
- Visual C++.NET GDI+编程基础