1. 通过LoadLibraryA GetProcAddress,动态调用无需配置链接库lib和相关的头文件配置。下面介绍一个例子的实现

1、动态库

A、加法类

  1. 头文件
    #pragma once
  2. class MyAdd
  3. {
  4. public:
  5. MyAdd();
  6. virtual ~MyAdd();
  7. int add(int a, int b);
  8. float add(float a, float b);
  9. };
  10. 源文件:
  11. #include "MyAdd.h"
  12. MyAdd::MyAdd()
  13. {
  14. }
  15. MyAdd::~MyAdd()
  16. {
  17. }
    int MyAdd::add(int a, int b)
  18. {
  19. return a + b;
  20. }
  21. float MyAdd::add(float a, float b)
  22. {
  23. return a + b;
  24. }

B、导出加法类接口

  1. 头文件:
    #include <stdlib.h>
  2.  
  3. #include "MyAdd.h"
  4. #include "add_api.h"
  5.  
  6. int csvMyAddGetInstance(void ** ppHandle)
  7. {
  8. MyAdd* p = new MyAdd();
  9. *ppHandle = p;
  10. return ;
  11. }
  12.  
  13. int csvMyAddReleaseInstance(void * ppHandle)
  14. {
  15. MyAdd* p = (MyAdd*)(ppHandle);
  16. if (p != NULL)
  17. {
  18. delete p;
  19. p = NULL;
  20. }
  21. return ;
  22. }
  23.  
  24. int csvMyAddaddInt(void ** ppHandle, int a, int b)
  25. {
  26. MyAdd* p = (MyAdd*)(ppHandle);
  27. if (p == NULL) return INT_MIN;
  28.  
  29. return a + b;
  30. }
  31.  
  32. float csvMyAddaddFloat(void ** ppHandle, float a, float b)
  33. {
  34. MyAdd* p = (MyAdd*)(ppHandle);
  35. if (p == NULL) return INT_MIN;
  36.  
  37. return a + b;
  38. }
  39.  
  40. 源文件:
    #ifndef CSV_ADD_API_H

#define CSV_ADD_API_H

#ifdef CSVADDAPI_LIB
  #define CSVADDAPI_LIB_EXPORT extern "C" __declspec(dllexport)
  #else
  #define CSVADDAPI_LIB_EXPORT extern "C" __declspec(dllimport)
  #endif

CSVADDAPI_LIB_EXPORT int csvMyAddGetInstance(void ** ppHandle);

CSVADDAPI_LIB_EXPORT int csvMyAddReleaseInstance(void * ppHandle);

CSVADDAPI_LIB_EXPORT int csvMyAddaddInt(void ** ppHandle, int a, int b);

CSVADDAPI_LIB_EXPORT float csvMyAddaddFloat(void ** ppHandle, float a, float b);

  1.  

#endif //CSV_ADD_API_H

  1.  

2、调用动态库

  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <string>
  4. #include<stdio.h>
  5. #include <windows.h>
  6. using namespace std;
  7.  
  8. /*通过LoadLibraryA 和 GetProcAddress,动态调用无需配置链接库lib和相关的头文件*/
  9.  
  10. typedef int(*MyAddGetInstance)(void **ppHandle); //定义类型:获取加法类的函数指针
  11. typedef int(*MyAddReleaseInstance)(void *ppHandle); //定义类型:声明释放加法类的函数指针
  12. typedef int(*MyAddAddInt)(void **ppHandle, int a, int b); //定义类型:声明整数的加法函数指针
  13.  
  14. int main(int argc, char** argv)
  15. {
  16. /*导入DLL库*/
  17. string dll_path = "MyDll.dll";
  18. HINSTANCE phandle = LoadLibraryA(dll_path.c_str());
  19.  
  20. /*获取 DLL库内部的函数句柄*/
  21. MyAddGetInstance csvMyAddGetInstance;
  22. csvMyAddGetInstance = (MyAddGetInstance)GetProcAddress(phandle, "csvMyAddGetInstance");
  23. MyAddReleaseInstance csvMyAddReleaseInstance;
  24. csvMyAddReleaseInstance = (MyAddReleaseInstance)GetProcAddress(phandle, "csvMyAddReleaseInstance");
  25. MyAddAddInt myAddAddInt;
  26. myAddAddInt = (MyAddAddInt)GetProcAddress(phandle, "csvMyAddaddInt");
  27.  
  28. /*调用函数*/
  29. void* pinst = NULL;
  30. csvMyAddGetInstance(&pinst);
  31. int res = myAddAddInt(&pinst, , );
  32. csvMyAddReleaseInstance(pinst);
  33.  
  34. cout << res << endl;
  35.  
  36. system("pause");
  37. return ;
  38. }

源码:源码下载

LoadLibraryA 和 GetProcAddress 调用动态库的更多相关文章

  1. # 2017-2018-2 20155228 《信息安全系统设计原理》 使用VirtualStudio2008创建和调用静态库和使用VirtualC++6.0创建和调用动态库

    使用virtual c++ 6.0创建和调用动态库 不得不说一下关于环境的问题 只要我打一个响指,一半的安装在win7上的VC6.0都会因为兼容性问题直接崩掉 懒得研究怎么解决兼容性的问题了,直接开一 ...

  2. [转]linux 调用动态库so文件

    记录一个面试被问到的问题. extern 有什么用途? 除了多文件共享全局变量外还有呢? extern "C" 的功能? 我想看完这篇文章就可以知道第三个问题了. 关于动态调用动态 ...

  3. windows 创建和调用 动态库,静态库

    windows创建和调用静态库 // MathFuncsLib.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b ...

  4. c++调用动态库失败解决办法

    c++调用动态库失败解决办法 之前写好的程序今天早上过来发现在服务器上出错了,于是就各种查问题,整整一个早上外加下午两个小时都在查这个问题,最终被我找到了问题: 在程序中我发现LoadLibrary( ...

  5. C++---初识《通过g++ / makefile 编译和调用动态库so文件》(ubuntu)

    C++---初识<通过g++ / makefile  编译和调用动态库so文件>(ubuntu) ------------------------目录------------------- ...

  6. Qt生成和调用动态库dll,和静态库.a(windows和linux通用)

    系统1:ThinkPad T570.Windows10.QT5.12.2(Qt Creater 4.8.2)一.动态库.dll的创建和调用1.在qtcreater中按如下步骤创建动态库,动态库名为my ...

  7. C++调用动态库中的虚基类成员函数时总是进错函数

    原创文章,转载请注明作者与本文原始URL. 问题描述:最近遇到这样一个问题,在调用C++的一个成员函数时,总是进错函数.在调用 pMsg->GetMsgContent() 的时候,总是进入到 p ...

  8. Java调用动态库方法说明-最详细

    Java不能直接调用由c或者c++写得dll(TF_ID.dll),所以只能采用jni得方法,一步一步生成符合规范得dll文件(假设叫FANGJIAN.dll),在FANGJIAN.dll这个文件里来 ...

  9. golang调用动态库

    测试动态库 test_so.h int test_so_func(int a,int b); test_so.c #include "test_so.h" int test_so_ ...

随机推荐

  1. 应用人员反馈报错,ORA-03137: TTC protocol internal error : [12333]

    一.报错现象 应用人员反馈连接不上数据库,连接报错. 我们使用PLSQL发现可以连接数据库,但是数据库DB Alert存在如下报错信息 DB AlertFri Oct :: Errors ): ORA ...

  2. 查准率(precision)和查全率(recall)

    一.理解查准率(precision)& 查全率(recall) 我们在平时常用到的模型评估指标是精度(accuracy)和错误率(error rate),错误率是:分类错误的样本数站样本总数的 ...

  3. C#基础--AbStract与Interface

         Interface: 接口方法不能用public abstract等修饰.接口内不能有字段变量,构造函数. 接口内可以定义属性,如string color{get;set;}这种. 实现接口 ...

  4. css3flex布局实现商品列表

    首先看图 手机商场经常会有商品列表功能,这样其实可以用flex布局实现 注意两个地方: 1.商品列表平衡间距(flex布局的换行加两端对齐) 2.中间文字行数不一样,会出现下方留下空白,如何解决(fl ...

  5. Unable to open nested entry '********.jar' 问题解决

    今天把现网版本的task的jar拖回来然后用7-zip打开拖了一个jar进去替换mysql-connector-java-5.1.47.jar  为  mysql-connector-java-5.1 ...

  6. GIL锁、进程池与线程池、同步异步

    GIL锁定义 GIL锁:Global Interpreter Lock  全局解释器 本质上是一把互斥锁 官方解释: 在CPython中,这个全局解释器锁,也称为GIL,是一个互斥锁,防止多个线程在同 ...

  7. leetcode-8.atoi · string *

    题面 原题挺长的,还是英文,就不抄了,

  8. 【Hibernate】 二级缓存及查询缓存

    一.Hibernate的二级缓存 1.1 类缓存区特点 缓存的是对象的散装的数据. 图一 Hibernate的二级缓存的散装数据 1.2 集合缓存区的特点: 缓存的是对象的id.需要依赖类缓冲区的配置 ...

  9. 09 Windows编程——键盘消息

    焦点窗口:接收到这个键盘事件的窗口称为有输入焦点的窗口.具有输入焦点的窗口要么是活动窗口,要么是活动窗口的子孙窗口. 活动窗口:活动窗口通常是很好鉴别的.它总是最上层的窗口——也就是说,它的父窗口句柄 ...

  10. java学习笔记13-重写与重载

    重写 重写是子类对父类允许访问的方法实现过程进行重新编写,返回值和参数都不能变. 重写方法不能抛出新的检查异常和比被重写方法更加宽泛的异常 访问权限不能比被重写方法低 声明为final的方法不能被重写 ...