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

1、动态库

A、加法类

头文件
#pragma once
class MyAdd
{
public:
MyAdd();
virtual ~MyAdd();
int add(int a, int b);
float add(float a, float b);
};
源文件:
#include "MyAdd.h"
MyAdd::MyAdd()
{
}
MyAdd::~MyAdd()
{
}
int MyAdd::add(int a, int b)
{
return a + b;
}
float MyAdd::add(float a, float b)
{
return a + b;
}

B、导出加法类接口

头文件:
#include <stdlib.h> #include "MyAdd.h"
#include "add_api.h" int csvMyAddGetInstance(void ** ppHandle)
{
MyAdd* p = new MyAdd();
*ppHandle = p;
return ;
} int csvMyAddReleaseInstance(void * ppHandle)
{
MyAdd* p = (MyAdd*)(ppHandle);
if (p != NULL)
{
delete p;
p = NULL;
}
return ;
} int csvMyAddaddInt(void ** ppHandle, int a, int b)
{
MyAdd* p = (MyAdd*)(ppHandle);
if (p == NULL) return INT_MIN; return a + b;
} float csvMyAddaddFloat(void ** ppHandle, float a, float b)
{
MyAdd* p = (MyAdd*)(ppHandle);
if (p == NULL) return INT_MIN; return a + b;
} 源文件:
#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);


#endif //CSV_ADD_API_H


2、调用动态库

#include <iostream>
#include <stdlib.h>
#include <string>
#include<stdio.h>
#include <windows.h>
using namespace std; /*通过LoadLibraryA 和 GetProcAddress,动态调用无需配置链接库lib和相关的头文件*/ typedef int(*MyAddGetInstance)(void **ppHandle); //定义类型:获取加法类的函数指针
typedef int(*MyAddReleaseInstance)(void *ppHandle); //定义类型:声明释放加法类的函数指针
typedef int(*MyAddAddInt)(void **ppHandle, int a, int b); //定义类型:声明整数的加法函数指针 int main(int argc, char** argv)
{
/*导入DLL库*/
string dll_path = "MyDll.dll";
HINSTANCE phandle = LoadLibraryA(dll_path.c_str()); /*获取 DLL库内部的函数句柄*/
MyAddGetInstance csvMyAddGetInstance;
csvMyAddGetInstance = (MyAddGetInstance)GetProcAddress(phandle, "csvMyAddGetInstance");
MyAddReleaseInstance csvMyAddReleaseInstance;
csvMyAddReleaseInstance = (MyAddReleaseInstance)GetProcAddress(phandle, "csvMyAddReleaseInstance");
MyAddAddInt myAddAddInt;
myAddAddInt = (MyAddAddInt)GetProcAddress(phandle, "csvMyAddaddInt"); /*调用函数*/
void* pinst = NULL;
csvMyAddGetInstance(&pinst);
int res = myAddAddInt(&pinst, , );
csvMyAddReleaseInstance(pinst); cout << res << endl; system("pause");
return ;
}

源码:源码下载

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. asp.net core-14.JWT认证授权 生成 JWT Token

    源码下载 语言组织能力不好 ,看这个 视频 用visual studio code打开文件,运行dotnet watch run 之后在postman里面去访问 拿到Token后

  2. hdu 6375 度度熊学队列 (链表模拟)

    度度熊正在学习双端队列,他对其翻转和合并产生了很大的兴趣.  初始时有 N 个空的双端队列(编号为 1 到 N ),你要支持度度熊的 Q 次操作. ①1 u w val 在编号为 u 的队列里加入一个 ...

  3. Unity UGUI动态生成控件

    一. 首先你得先清楚RectTransform组件的一些程序控制 1. 先得到UGUI控件上面的RectTransform组件 RectTransform rtr = gameObject.GetCo ...

  4. hdu 1698 线段数的区间更新 以及延迟更新

    先说说区间更新和单点更新的区别 主要的区别是搜索的过程 前者需要确定一个区间 后者就是一个点就好了 贴上两者代码 void updata(int i)//单点更新 { int l=stu[i].l; ...

  5. 体验三大JavaScript文件上传库(Uppy.js/Filepond/Dropzone)

    最近发现了一个高颜值的前端上传组件Uppy.js,立即上手体验了一波,感觉还不错.然后又看到同类型的Filepond以及Dropzone.js,对比体验了一下,感觉都很优秀,但是在体验过程中,都遇到了 ...

  6. 最简单的理解 建立TCP连接 三次握手协议

     最简单的理解一:建立TCP连接:三次握手协议    客户端:我要对你讲话,你能听到吗:服务端:我能听到:而且我也要对你讲话,你能听到吗:客户端:我也能听到.…….互相开始通话…….. 二:关闭TCP ...

  7. JVM内存结构划分

    JVM内存结构划分 JVM内存结构划分 数据区域划分 程序计数器 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 StringTable 直接内存 创建新对象说明 对象的创建 对象的内存布局 对象头 ...

  8. Trie-Tree

    最近写了一些关于字典树的题目,这里做个简单的整理. 字典树,又叫单词查找树,顾名思义就是查单词的(不仅仅o),和词典一样.不同的是词典是用纸做的,而字典树是用树形结构构建的. 她用来快速检索你要的内容 ...

  9. MRC下delegate 野指针问题

    最近项目开发中,临时被调去修复一个页面返回时crash的问题.出现这个问题的原因也很巧合,正好服务地址在同事电脑上,也正巧网络请求响应时间狂慢!一个请求发出去回来的时间是40秒左右,要是在线上,肯定会 ...

  10. Docker安装nginx,把nginx.conf放入指定位置

    拉取镜像 docker pull nginx 创建目录 创建一个目录用来存放文件,方便我们进行修改 mkdir -p /everything/nginx/conf /everything/nginx/ ...