LoadLibraryA 和 GetProcAddress 调用动态库
通过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 调用动态库的更多相关文章
- # 2017-2018-2 20155228 《信息安全系统设计原理》 使用VirtualStudio2008创建和调用静态库和使用VirtualC++6.0创建和调用动态库
使用virtual c++ 6.0创建和调用动态库 不得不说一下关于环境的问题 只要我打一个响指,一半的安装在win7上的VC6.0都会因为兼容性问题直接崩掉 懒得研究怎么解决兼容性的问题了,直接开一 ...
- [转]linux 调用动态库so文件
记录一个面试被问到的问题. extern 有什么用途? 除了多文件共享全局变量外还有呢? extern "C" 的功能? 我想看完这篇文章就可以知道第三个问题了. 关于动态调用动态 ...
- windows 创建和调用 动态库,静态库
windows创建和调用静态库 // MathFuncsLib.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b ...
- c++调用动态库失败解决办法
c++调用动态库失败解决办法 之前写好的程序今天早上过来发现在服务器上出错了,于是就各种查问题,整整一个早上外加下午两个小时都在查这个问题,最终被我找到了问题: 在程序中我发现LoadLibrary( ...
- C++---初识《通过g++ / makefile 编译和调用动态库so文件》(ubuntu)
C++---初识<通过g++ / makefile 编译和调用动态库so文件>(ubuntu) ------------------------目录------------------- ...
- Qt生成和调用动态库dll,和静态库.a(windows和linux通用)
系统1:ThinkPad T570.Windows10.QT5.12.2(Qt Creater 4.8.2)一.动态库.dll的创建和调用1.在qtcreater中按如下步骤创建动态库,动态库名为my ...
- C++调用动态库中的虚基类成员函数时总是进错函数
原创文章,转载请注明作者与本文原始URL. 问题描述:最近遇到这样一个问题,在调用C++的一个成员函数时,总是进错函数.在调用 pMsg->GetMsgContent() 的时候,总是进入到 p ...
- Java调用动态库方法说明-最详细
Java不能直接调用由c或者c++写得dll(TF_ID.dll),所以只能采用jni得方法,一步一步生成符合规范得dll文件(假设叫FANGJIAN.dll),在FANGJIAN.dll这个文件里来 ...
- golang调用动态库
测试动态库 test_so.h int test_so_func(int a,int b); test_so.c #include "test_so.h" int test_so_ ...
随机推荐
- 【爬虫集合】抖音API分析
1. 分析接口 Charles注册码 Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4 抖音API分析 抖音.猫眼网页 ...
- CSS3中三种清除浮动(float)影响的方式
float是HTML中布局的一大关键,很多难题一旦用上float都能很愉快地解决.但是凡是好用的,也容易出错.比如当子元素都为float时,其父元素会受影响,或者偶尔会发现自己某个div的高度变成了0 ...
- (九)Struts标签基础(二)
2.3 非表单标签 2.3.1 <s:actionerror>标签, this.addActionError("错误信息1"); //使用addActionErro ...
- 调用顺丰API实现电商专递下单和获取面单功能
参考文章:https://www.cnblogs.com/zhangxiaoyong/p/8317229.html 顺丰需求文档: 链接:https://pan.baidu.com/s/16EEaph ...
- python - pyxel 制作游戏
之前看了一个项目,觉得还挺有意思的,是关于做一个像素风的游戏,现在,虚幻4,u3d,已经让游戏愈发的好看,好玩,曾经我们童年的像素风游戏,愈来愈少.所以,这里我们就回味下. Pyxel是一个pytho ...
- 使用shared memory 计算矩阵乘法 (其实并没有加速多少)
#include "cuda_runtime.h" #include "device_launch_parameters.h" #include "d ...
- Docker安装nginx,把nginx.conf放入指定位置
拉取镜像 docker pull nginx 创建目录 创建一个目录用来存放文件,方便我们进行修改 mkdir -p /everything/nginx/conf /everything/nginx/ ...
- js 定时器(setTimeout/setInterval)出现变量未定义(xxx is not defined) 的解决方法
首先声明本人资质尚浅,如有错误,欢迎指正.共同提高. ------------------------------------------------------------------------- ...
- Mongodb 的ORM框架 Morphia 注解 之 @Reference
public class BlogEntry { private String title; private Date publishDate; private String body; privat ...
- 05.网站点击流数据分析项目_模块开发_ETL
项目的数据分析过程在hadoop集群上实现,主要应用hive数据仓库工具,因此,采集并经过预处理后的数据,需 要加载到hive数据仓库中,以进行后续的挖掘分析. ETL:用来描述将数据从来源端经过抽取 ...