C++批量加载动态库函数方法
1、枚举定义
enum
{
// 0 - GigE DLL (implicitly called)
Func_isVersionCompliantDLL,
Func_isDriverAvailable,
}
SVGigE_FUNCTION;
2、函数管理器:定义函数指针、ID(使用枚举)、函数名
struct _GigEFunc
{
FARPROC function_pointer;
SVGigE_FUNCTION function_id;
char *function_name;
}
GigEFunc[] =
{
// 0 - GigE DLL (implicitly called)
NULL, Func_isVersionCompliantDLL, "isVersionCompliantDLL",
NULL, Func_isDriverAvailable, "isDriverAvailable",
} 3、加载动态库,初始化函数指针
HINSTANCE GigEDLL = NULL; bool isLoadedGigEDLL()
{
if( NULL == GigEDLL )
{
// Try to load GigE DLL
GigEDLL = LoadLibrary(SVGigE_DLL); // Check DLL availability
if( NULL == GigEDLL )
return false;
} // Check if size of function table matches the number of imported functions
int FunctionCount = sizeof(GigEFunc) / sizeof(struct _GigEFunc);
if( FunctionCount != Func_isVersionCompliantDLL_consistency_check + )
return false; // Obtain CameraContainer procedure addresses
bool function_loaded = true;
for( int function_index = Func_isVersionCompliantDLL;
function_index < (sizeof(GigEFunc) / sizeof(struct _GigEFunc));
function_index++
)
{
GigEFunc[function_index].function_pointer = GetProcAddress(GigEDLL, GigEFunc[function_index].function_name); // Check if function was found
if( NULL == GigEFunc[function_index].function_pointer )
function_loaded = false;
} // Check if all function pointers could successfully be obtained from the DLL
if( function_loaded == false )
return false;
else
return true;
} 4、定义函数指针
typedef SVGigE_RETURN
(*TFunc_isVersionCompliantDLL)(SVGigE_VERSION *DllVersion,
SVGigE_VERSION *ExpectedVersion);
typedef SVGigE_RETURN(*TFunc_isDriverAvailable)();
5、外部访问函数接口
SVGigE_RETURN
isVersionCompliantDLL(SVGigE_VERSION *DllVersion,
SVGigE_VERSION *ExpectedVersion)
{
// Check DLL availability
if( NULL == GigEDLL ) //HINSTANCE GigEDLL = NULL hInstance是操作系统分配给实例的指针. 程序根据hInstance访问其相应的内存空间
{
// Try to load SVGigE DLL
if( !isLoadedGigEDLL() )
return SVGigE_DLL_NOT_LOADED;
} // Pass through function call to DLL
//
// 2011-08-22/EKantz: check consistency of the whole function pointer
// table by calling the last function in that table.
//
return ((TFunc_isVersionCompliantDLL)
GigEFunc[Func_isVersionCompliantDLL_consistency_check].function_pointer)(DllVersion, ExpectedVersion);
} SVGigE_RETURN
isDriverAvailable()
{
// Check DLL availability
if( NULL == GigEDLL )
{
// Try to load SVGigE DLL
if( !isLoadedGigEDLL() )
return SVGigE_DLL_NOT_LOADED;
} // Pass through function call to DLL
return ((TFunc_isDriverAvailable)
GigEFunc[Func_isDriverAvailable].function_pointer)();
}
C++批量加载动态库函数方法的更多相关文章
- js实现动态加载脚本的方法实例汇总
本文实例讲述了js实现动态加载脚本的方法.分享给大家供大家参考,具体如下: 最近公司的前端地图产品需要做一下模块划分,希望用户用到哪一块的功能再加载哪一块的模块,这样可以提高用户体验. 所以到处查 ...
- Linux下C++动态加载so 调用方法
Windows 下的C++动态加载DLL调用方法 文献参考 http://man7.org/linux/man-pages/man0/dlfcn.h.0p.html http://man7.org/l ...
- Java类的加载の动态
类的加载方式 静态加载类,是编译时刻加载 动态加载类,是运行时刻加载 new创建对象:是静态加载类,在编译时刻就需要加载所有的可能使用到的类.有一个类有问题(如不存在),都不能通过编译,会报错. Cl ...
- Linux下c函数dlopen实现加载动态库so文件代码举例
dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...
- LoadLibrary加载动态库失败
[1]LoadLibrary加载动态库失败的可能原因以及解决方案: (1)dll动态库文件路径不对.此场景细分为以下几种情况: 1.1 文件路径的确错误.比如:本来欲加载的是A文件夹下的动态库a.dl ...
- Android之批量加载图片OOM问题解决方案
一.OOM问题出现的场景和原因 一个好的app总少不了精美的图片,所以Android开发中图片的加载总是避免不了的,而在加载图片过程中,如果处理不当则会出现OOM的问题.那么如何彻底解决这个问题呢?本 ...
- 在mybatis 中批量加载mapper.xml
可以直接加载一个包文件名,将这个包里的所有*mapper.xml文件加载进来. 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载: 必须按一定的标准:即xml文件和 ...
- Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结
Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结 Atitit.java load class methods 1. 动态加载jar文件和class文件. 1 ...
- 【转载】cocos2dx 中 Android NDK 加载动态库的问题
原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各 ...
随机推荐
- HDU_1517_博弈(巧妙规律)
A Multiplication Game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- webpack学习(二)
时下很火的react项目多用到webpack+ES6,本文只实践webpack的打包功能,不涉及react. 1.新建项目 新建的项目,命令模式下切换到项目根路径,用npm init命令生成packa ...
- day001 Python 计算机基础(2019年5月16日)
      作为一名程序员或者即将踏入IT行业的准程序员,学习任何一门编程语言,都需要有基本的计算机基础 ...
- SqlLite提高批量插入速度的方法及原因分析
(1)-SQLite忽略大小写查询大部分数据库在进行字符串比较时,对大小写是不敏感的.但是SQLite却是大小写敏感的.如果想让SQLite忽略大小写,方法如下:方法一:使用大小写转换函数LOWER. ...
- BZOJ 3450: Tyvj1952 Easy 数学期望
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...
- sql语句学习(NOT EXISTS 和 NOT IN )
NOT EXISTS SELECT a.*FROM t_user aWHERE a.id_card LIKE '%3203821995100%'AND NOT EXISTS ( SELECT id F ...
- ps图标长投影如何做?
https://jingyan.baidu.com/article/2f9b480dad9c8e41cb6cc297.html ps图标长投影
- 数据库--ACID特性
事务的ACID属性 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. 一致性(Consistency) 事务必须使数据库从一个一致性状态变换 ...
- MySQL架构优化实战系列3:定时计划任务与表分区
原创 2016-07-08 汤抗 DBAplus社群 一 定时计划任务 1.概论 mysql计划任务可以定时更新数据库表或者做大文件的汇总表. 2.配置 开启计划任务 SHOW VARIABL ...
- 公告:CSDN博客积分系统升级(暂行版)
各位亲爱的用户: CSDN博客频道将于2014年10月22日23点至10月23日8点进行积分系统的升级,升级期间会影响大家的正常訪问和操作.给大家带来不便.敬请广大用户谅解.很多其它详情见>&g ...