动态库的编写和使用
来源:互联网 发布:mysql scope identity 编辑:程序博客网 时间:2024/06/01 20:28
一、动态库的编写:
1.Test_Dll.h
<span style="font-size:18px;">#pragma once////函数申明extern "C" int __declspec(dllexport) Add(int a, int b); int Sub(int a, int b);//__declspec(dllexport) 申明指定这个函数为动态库的导出函数//extern "C" 申明为C的扩展方式////全局变量申明extern int __declspec(dllexport) g_value; //头文件只做全局变量的申明////类的申明class __declspec(dllexport) Test{public:Test(int d=0);~Test();public:void SetData(int d);int GetData()const;private:int data;};</span>
2.Test_Dll.cpp
<span style="font-size:18px;">#include <iostream>#include "Test_Dll.h"using namespace std;////函数实现int Add(int a,int b){return a+b;}int Sub(int a,int b){return a-b;}////全局变量的定义int g_value = 10;////类的实现Test::Test(int d=0){data = d;}Test::~Test(){}void Test::SetData(int d){data = d;}int Test::GetData()const{return data;}</span>
LIBRARY "Test_Dll"
EXPORTS
g_value CONSTIANT
运行后会在debug文件夹中产生一个 " Test_Dll.dll " 文件,用于动态加载
注意只有在申明有导出函数时才会生成"Test_Dll.lib" 文件,用于静态加载
二.动态库的使用:
分为静态加载和动态加载:
1.使用静态加载的方式:将.h文件,.dll文件 , .lib文件放入本文件中;
在mian.cpp中
<span style="font-size:18px;">#include <iostream>#include "Test_Dll.h"using namespace std;#pragma comment(lib,"Test_Lib.lib") //显示包含静态库extern int __declspec(dllimport) g_value; //全局变量导入void main(){int a = 10;int b = 20;cout<<Add(a,b)<<endl; //正确,为导出函数cout<<Sub(a,b)<<endl; //错误,不是导出函数cout<<*(int*)g_value<<endl; //全局变量的使用Test t; //类的调用t.SetData(100);cout<<t.GetData()<<endl;}</span>
动态库的静态加载方式和静态库不同之处在于,静态库一旦编译到处运行,而动态库不行。
动态链接库的.lib只是一些动态库的信息,而没有函数的实现
静态链接库的.lib有函数的实现
2.使用动态加载的方式:将.h文件,.dll文件文件放入本文件中;
<span style="font-size:18px;">#include <iostream>#include <windows.h>#include "Test_Dll.h"using namespace std;//LoadLibrary()//GetProcAddress()//FreeLibrary()typedef int(*pFun)(int,int);void main(){HIGSTANCE hDll;hDll = LoadLibrary("Test_Dll.dll"); //动态加载动态库if(hDll == NULL){cout<<"Load Library Error!"<<endl;return;}//调用动态库函数,此处就是为什么要在函数申明时要加extren "C"的原因:因为函数调用只有函数名;pFun pAdd = (pFun)GetProcAddress(hDll."Add"); if(pAdd == NULL){cout<<"Get Functional Error !"<<endl;}else{cout<<Add(10,3)<<endl;}FreeLibrary(hDll); //释放库文件}</span>
同样不能移动之后执行;
0 0
- 动态链接库的编写和使用
- 动态库的编写和使用
- Linux静态库和动态库的编写和使用
- Linux静态库和动态库的编写和使用
- 动态链接库的编写和使用详解
- 动态链接库的编写和使用详解
- 动态链接库的编写和使用详解
- 动态链接库的编写和使用详解
- 动态链接库的编写和使用详解
- linux 静态动态链接库的编写和使用
- 动态链接库的编写和使用详解
- 动态链接库的编写和使用详解
- linux 下 动态库的编写和使用
- linux动态链接库编写和使用
- linux动态链接库编写和使用
- linux动态链接库编写和使用
- vs2012编写和使用动态库
- linux 生成和使用动态链接库和静态链接库的Makefile编写
- C++学习笔记(一)
- Codevs 1035 火车停留 [费用流] [拆点]
- Android view背景动态改变带简单淡入淡出动画
- poj3260&&hdu3591 多重背包+完全背包
- 1023. Have Fun with Numbers (20)
- 动态库的编写和使用
- POJ 3601 Tower of Hanoi
- Effecitive C++_Item20笔记
- 多线程——继承Thread 类和实现Runnable 接口的区别
- 公告
- JAVA ASCII码 读入字符串测试
- C与C++中的enum类型使用
- 在Ubuntu中安装Visual Studio Code
- Begin_With_AngularJS(1)基础:ng-app,ng-controller,代码分离,模板,作用域等