首页 > 编程语言 >C++ 导入动态链接库DLL 中的函数

C++ 导入动态链接库DLL 中的函数

时间:2022-09-26 15:58:00浏览次数:59  
标签:hdll 函数 int 句柄 C++ DLL MS 动态链接库

C++ 导入动态链接库DLL 中的函数

  1. 声明头文件<windows.h>,利用windows库进行DLL的加载
    #include <windows.h>
  2. 然后用typedef定义一个指针函数类型 typedef void(**fun) ,这个指针类型,要和你调用的函数类型和参数保持一致,记住,是指针参数就是 (int *,int)
    typedef int (*MS_Init)(char*, char*, int, int, int);
  3. 定一个句柄实例,用来取DLL的实例地址
    HINSTANCE hdll = LoadLibrary(L"./cys.dll");
  4. 取的地址要判断,返回的句柄是否为空,如果为无效句柄,那么要释放加载DLL所占用的内存。
    FreeLibrary(hdll);
  5. 然后定义一个函数指针,用来获取你要用的函数地址
    MS_Init MS_InitFunc = (MS_Init)GetProcAddress(hdll, ("MS_Init"));
    这里也要判断要函数指针是否为空,如果没取到要求的函数,那么要释放句柄
  6. 然后通过函数指针来调用函数。
    FUN(int *p,int count);这里不能用函数名来使用函数,因为这个DLL本身不是当前CPP的一部分,而是通过windows去调用.没有在这个工程里声明或者定义,而是暴露出一个头,要指针获取他的地址,通过指针来调用.
    InitStatus = MS_InitFunc(MSCT, LogFile, 1, 2, 0);

最后调用结束后,就释放句柄

完整代码如下

HINSTANCE loaddll()
{
    HINSTANCE hdll = LoadLibrary(L"./cys.dll");
    if (hdll == NULL)
    {
        printf("Load Failed\n");
    }
    else
    {
        cout << "Load Success" << endl;
    }
    return hdll;
}
typedef int (*MS_Init)(char*, char*, int, int, int);

HINSTANCE hdll = loaddll();
MS_Init MS_InitFunc = (MS_Init)GetProcAddress(hdll, ("MS_Init"));
if (MA_InitFunc)
{
	cout << "func load success" << endl;
}
InitStatus = MS_InitFunc(MSCT, LogFile, 1, 2, 0);

标签:hdll,函数,int,句柄,C++,DLL,MS,动态链接库
From: https://www.cnblogs.com/cokefentas/p/16731187.html

相关文章

  • C++自学笔记
    初始化pA(){p=0;cout<<"A::A()"<<endl;}初始化列表InitializerlistA():p(0){cout<<"A::A()"<<endl;}      初始化vs赋值   赋值=默认初始化+......
  • C++ 数组指针累加后的偏移量
    typedefstruct_MyStruct{ inta; intb; intc; _MyStruct(){a=0;b=0;c=0;}}MyStruct;intmain(){#if1 MyStruct*st[3]; //数组指针 MyStruct......
  • OpenCV CMake windows下 C++ OpenCV配置及x86编译(傻瓜式教程)
    本傻瓜教程需要的环境如下:IDE:vs2015或vs2017, windows10或11关于vs的版本,个人觉得不管是社区版个人版还是企业版,对于我们工作学习的个人来说都一样,......
  • c++笔记
    数据类型的意义在于给变量分配合适的内存空间,防止资源浪费#define定义常量一、整型:short、int、long、longlong    超出数值将会在另一端显示(衔尾蛇)sizeof(数......
  • C++ STL快速入门总结
    STL是“StandardTemplateLibrary”的缩写,中文译为“标准模板库”。STL是C++标准库的一部分,不用单独安装。C++对模板(Template)支持得很好,STL就是借助模板,把常用的数......
  • C++实现递归法求1!+2!+3!+…+n!的和
    1#define_CRT_SECURE_NO_WARNINGS2#include<iostream>34usingnamespacestd;5//用递归求某一项的阶乘的值6intfun(inti)//求第i项的值7{8......
  • C++程序实现100—999中所有的水仙花数输出
    ​提示:如果三位数ABC满足ABC=A3+B3+C3,则称其为水仙花数废话不多说,直接上代码,注意看注释要对自己负责#define_CRT_SECURE_NO_WARNINGS#include<iostream>usingna......
  • 不同的二叉搜索树的种数数量 C/C++ 动态规划
    #if 0class Solution {public:    int numTrees(int n) {        vector<int> s(n+1);   // 取值范围有n个数,取n个数范围内的任意一个树做根......
  • C++ 自学笔记 访问限制 Setting limits
    Settinglimits  让客户不能改,让设计者可以改 C++:  任何人访问成员函数访问(同一个类的不同实例化对象可以相互访问私有成员变量)类自己或子类访问 friend......
  • C++ 自学笔记 new和delete(动态内存分配)
    动态内存分配DynamicmemoeyallocationC++使用new和delete来申请和释放内存new:先申请一个空间int\Stash:默认构造函数初始化对象~:析构函数析构delete:再释放空间......