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_ ...
随机推荐
- 应用人员反馈报错,ORA-03137: TTC protocol internal error : [12333]
一.报错现象 应用人员反馈连接不上数据库,连接报错. 我们使用PLSQL发现可以连接数据库,但是数据库DB Alert存在如下报错信息 DB AlertFri Oct :: Errors ): ORA ...
- 查准率(precision)和查全率(recall)
一.理解查准率(precision)& 查全率(recall) 我们在平时常用到的模型评估指标是精度(accuracy)和错误率(error rate),错误率是:分类错误的样本数站样本总数的 ...
- C#基础--AbStract与Interface
Interface: 接口方法不能用public abstract等修饰.接口内不能有字段变量,构造函数. 接口内可以定义属性,如string color{get;set;}这种. 实现接口 ...
- css3flex布局实现商品列表
首先看图 手机商场经常会有商品列表功能,这样其实可以用flex布局实现 注意两个地方: 1.商品列表平衡间距(flex布局的换行加两端对齐) 2.中间文字行数不一样,会出现下方留下空白,如何解决(fl ...
- Unable to open nested entry '********.jar' 问题解决
今天把现网版本的task的jar拖回来然后用7-zip打开拖了一个jar进去替换mysql-connector-java-5.1.47.jar 为 mysql-connector-java-5.1 ...
- GIL锁、进程池与线程池、同步异步
GIL锁定义 GIL锁:Global Interpreter Lock 全局解释器 本质上是一把互斥锁 官方解释: 在CPython中,这个全局解释器锁,也称为GIL,是一个互斥锁,防止多个线程在同 ...
- leetcode-8.atoi · string *
题面 原题挺长的,还是英文,就不抄了,
- 【Hibernate】 二级缓存及查询缓存
一.Hibernate的二级缓存 1.1 类缓存区特点 缓存的是对象的散装的数据. 图一 Hibernate的二级缓存的散装数据 1.2 集合缓存区的特点: 缓存的是对象的id.需要依赖类缓冲区的配置 ...
- 09 Windows编程——键盘消息
焦点窗口:接收到这个键盘事件的窗口称为有输入焦点的窗口.具有输入焦点的窗口要么是活动窗口,要么是活动窗口的子孙窗口. 活动窗口:活动窗口通常是很好鉴别的.它总是最上层的窗口——也就是说,它的父窗口句柄 ...
- java学习笔记13-重写与重载
重写 重写是子类对父类允许访问的方法实现过程进行重新编写,返回值和参数都不能变. 重写方法不能抛出新的检查异常和比被重写方法更加宽泛的异常 访问权限不能比被重写方法低 声明为final的方法不能被重写 ...