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 加载动态库的问题 闲聊 最近在接入各 ...
随机推荐
- dapper.net 存储过程
var param = new DynamicParameters(); param.Add(); param.Add(); param.Add(, DbType.Int32, ParameterDi ...
- PJAX全局无刷新的设置方法~
先添加必要文件: <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></scrip ...
- 移动APP 微信支付完整过程(wxPay 方案一)
apicloud.weixinpay官方提供了两种方案. 本模块封装了两套支付方案: 方案一:开发者通过 getOrderId.payOrder 自己处理签名过程(微信开放平台建议把 getOrder ...
- pytorch基础(4)-----搭建模型网络的两种方法
方法一:采用torch.nn.Module模块 import torch import torch.nn.functional as F #法1 class Net(torch.nn.Module): ...
- eas之打开窗体
UIContext uiContext=new UIContext(this);IUIWindow uiWindow=UIFactory.createUIFactory(UIFactoryName.E ...
- 【剑指Offer】56、删除链表中重复的结点
题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4-> ...
- /proc目录介绍
1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以 ...
- PKU 1019 Number Sequence(模拟,思维)
题目 以下思路参考自discuss:http://poj.org/showmessage?message_id=176353 /*我的思路: 1.将长串数分成一个个部分,每个部分是从1到x的无重复的数 ...
- linux中php项目无法发送邮件:PEAR mail package is not installed
发送邮件报错误:PEAR mail package is not installed的原因是linux中缺少PEAR mail组件, PEAR mail组件也就是PHP Pear Mail / SMT ...
- elementUI 图片上传限制上传图片的宽高
文件上传,需当上传的文件类型为图片的时候,需要限制图片的宽高. 此处采用了new Promise异步加载的方式,等图片上传加载完成后, 页面代码: <el-form-item label=&qu ...