通过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. VMware 克隆的相关设置

    点击管理--克隆,进行克隆操作完成后,进行下面设置: 1.删除原先PCI设置  vi /etc/udev/rules.d/70-persistent-net.rules 2.修改MAC地址及IP  v ...

  2. PyCryptodome安装使用方法

    PyCryptodome是PyCrypto的一个分支.基于PyCrypto2.6.1,多了以下特性: Authenticated encryption modes (GCM, CCM, EAX, SI ...

  3. MySQL 子查询(四)子查询的优化、将子查询重写为连接

    MySQL 5.7 ref ——13.2.10.10优化子查询 十.子查询的优化 开发正在进行中,因此从长远来看,没有什么优化建议是可靠的.以下列表提供了一些您可能想要使用的有趣技巧.See also ...

  4. 数据结构-平衡二叉树Java实现

    1,Node.java package com.cnblogs.mufasa.BalanceBinaryTree; public class Node { Node parent; Node left ...

  5. 常用shell命令积累

    把学习工作中见到的shell命令积累下来 创建文件夹 mkdir 创建文件 touch 发送get请求 curl xxxxx 发送post请求 curl -d xxxxx

  6. Shell学习笔记:awk实现group by分组统计功能

    日常部分数据以 txt 的文件格式提供,为避免入库之后再进行统计的麻烦,故学习 shell 进行处理,减少工作量. 1.样例数据 # test.txt YD5Gxxx|6618151|68254490 ...

  7. 【python】python configparser模块

    ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section), 每个节可以有多个参数(键=值).使用的配置 ...

  8. 配置tmux在机器重启后自动恢复tmux工作现场,告别重启恐惧症

    1. 问题出现的背景 通过ssh远程登录服务器在上面工作,有时候很有可能由于网络断开而导致ssh链接断开,或者下班后想继续在家登录到服务器继续工作.这些情况都需要服务器保持我们的工作环境,比如,vim ...

  9. NginX——配置负载均衡

    A.            在http模块加上upstream配置 upstream www.myweb.com { server  127.0.0.1:9100 weight=3; server  ...

  10. YOLO---Darknet下的 GPU vs CPU 速度

    YOLO---Darknet下的 GPU vs CPU 速度 目录 一.基础环境 二.安装Darknet-yolo v3 三.CPU下测试 四.GPU下测试 五.测试速度对比结论 正文 一.基础环境 ...