C++批量加载动态库函数方法

时间:2021-08-23 02:16:59
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++批量加载动态库函数方法的更多相关文章

  1. js实现动态加载脚本的方法实例汇总

      本文实例讲述了js实现动态加载脚本的方法.分享给大家供大家参考,具体如下: 最近公司的前端地图产品需要做一下模块划分,希望用户用到哪一块的功能再加载哪一块的模块,这样可以提高用户体验. 所以到处查 ...

  2. Linux下C&plus;&plus;动态加载so 调用方法

    Windows 下的C++动态加载DLL调用方法 文献参考 http://man7.org/linux/man-pages/man0/dlfcn.h.0p.html http://man7.org/l ...

  3. Java类的加载の动态

    类的加载方式 静态加载类,是编译时刻加载 动态加载类,是运行时刻加载 new创建对象:是静态加载类,在编译时刻就需要加载所有的可能使用到的类.有一个类有问题(如不存在),都不能通过编译,会报错. Cl ...

  4. Linux下c函数dlopen实现加载动态库so文件代码举例

    dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...

  5. LoadLibrary加载动态库失败

    [1]LoadLibrary加载动态库失败的可能原因以及解决方案: (1)dll动态库文件路径不对.此场景细分为以下几种情况: 1.1 文件路径的确错误.比如:本来欲加载的是A文件夹下的动态库a.dl ...

  6. Android之批量加载图片OOM问题解决方案

    一.OOM问题出现的场景和原因 一个好的app总少不了精美的图片,所以Android开发中图片的加载总是避免不了的,而在加载图片过程中,如果处理不当则会出现OOM的问题.那么如何彻底解决这个问题呢?本 ...

  7. 在mybatis 中批量加载mapper&period;xml

    可以直接加载一个包文件名,将这个包里的所有*mapper.xml文件加载进来. 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载: 必须按一定的标准:即xml文件和 ...

  8. Atitit&period;&&num;160&semi;木马病毒的外部class自动加载机制------加载class的方法总结

    Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结 Atitit.java load class methods 1. 动态加载jar文件和class文件. 1 ...

  9. 【转载】cocos2dx 中 Android NDK 加载动态库的问题

     原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各 ...

随机推荐

  1. 转:python字符串&sol;元组&sol;列表&sol;字典互转

    #-*-coding:utf-8-*-  #1.字典 dict = {'name': 'Zara', 'age': 7, 'class': 'First'} #字典转为字符串,返回:<type ...

  2. js移动焦点到最后

      当输入框(input/textarea)获得焦点时,将焦点移动到最后,在某些情况下用户体验很好.网上的大部分方法都是针对IE浏览器的.代码如下: var el = document.getElem ...

  3. 用JAVA代码构造一个日历

    package day0603; import java.text.ParseException; import java.text.SimpleDateFormat; import java.uti ...

  4. APNs-远程推送

    一.开发iOS程序的推送功能, iOS端需要做的事 1.请求苹果获得deviceToken 2.得到苹果返回的deviceToken 3.发送deviceToken给公司的服务器 4.监听用户对通知的 ...

  5. Inno Setup打包添加和去除管理员权限

    原文:Inno Setup打包添加和去除管理员权限 添加管理员权限 1.在[Setup]节点添加 PrivilegesRequired=admin 2.进入安装目录,找到文件SetupLdr.e32, ...

  6. AndroidStudio使用注意事项

    今天在引入GitHUb上的开源框架时,写好依赖后编译时,报以下错误: Error:Execution failed for task ':app:processDebugResources'.> ...

  7. python脚本批量生成数据

    在平时的工作中,经常会遇到造数据,特别是性能测试的时候更是需要大量的数据.如果一条条的插入数据库或者一条条的创建数据,效率未免有点低.如何快速的造大量的测试数据呢?在不熟悉存储过程的情况下,今天给大家 ...

  8. 「Continuous&lowbar;integration&comma; CI」为什么要持续集成&quest;

    前言   什么是持续集成,为什么要持续集成?本文对持续集成前后两种开发实践做了对比分析,从而直观的感受到持续集成的好处. 在说持续集成之前,先说一下传统的开发模式: 传统模式: 传统模式过程如下: 传 ...

  9. 手把手编写PHP MVC框架实例教程

    源地址:https://www.awaimai.com/128.html#comment-27466 这个不错,用php实现mvc最核心功能,代码量只有几十K. 其实,不管用那种方法,最终都是incl ...

  10. zookeeper 实现分布式锁安全用法

    zookeeper 实现分布式锁安全用法 标签: zookeeper sessionExpire connectionLoss 分布式锁 背景 ConnectionLoss 链接丢失 SessionE ...