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++动态加载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.xml

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

  8. Atitit. 木马病毒的外部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. 小程序viewflex布局的对齐不对的问题

    index.wxml: <view class="container"> <view class="nav-container"> &l ...

  2. javaee字符缓冲输出流

    package Zjshuchu; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOExcepti ...

  3. tomcat 热加载设置

    找到tomcat项目的apache-tomcat-8.0.30\conf\context.xml,打开进行编辑,把Context项中加上 reloadable="true" < ...

  4. eas之打开窗体

    UIContext uiContext=new UIContext(this);IUIWindow uiWindow=UIFactory.createUIFactory(UIFactoryName.E ...

  5. nyoj4-ASCII码排序

    ASCII码排序 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输入一个数N, ...

  6. Linux思维导图之用户、组和权限

    安全3A: Authenticanion认证:验证用户身份; 授权授权;依据身份进行不同权利的分配.Acouting | 劲舞团审计:监督工作. user:id -u 令牌:(护符)ID号 .Linu ...

  7. Problem 19

    Problem 19 You are given the following information, but you may prefer to do some research for yours ...

  8. 微信小程序获取登录手机号

    小程序获取登录用户手机号. 因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 <button> 组件的点击来触发. 首先,放置一个 button 按钮,将 ...

  9. Fleury算法 求欧拉回路

    Fleury算法 #include <iostream> #include <cstdio> #include <cstring> #include <cma ...

  10. Navicat Premium (patch and keygen)

    标签:Navicat 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog.51cto.com/353572/13 ...