动态库的编写和使用

    xiaoxiao2025-01-15  8

    一、动态库的编写

    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> 同样不能移动之后执行;

    转载请注明原文地址: https://ju.6miu.com/read-1295516.html
    最新回复(0)