动态库的编写和使用

来源:互联网 发布: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>


3.Test_Dll.def  //若有全局变量,则需要创建这个文件


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
原创粉丝点击