根据函数名载入库函数(GetProcAddress、dlsym)
来源:互联网 发布:淘宝新品标签图片制作 编辑:程序博客网 时间:2024/06/09 18:14
根据函数名载入库函数(GetProcAddress、dlsym)
不废话上代码:
#ifdef WIN32#include <windows.h>typedef HINSTANCE HandleType;#define LoadLib(filename) LoadLibraryA(filename)#define UnLoadLib(handle) FreeLibrary(handle)#define GetProcessAddressByName(handle,name) GetProcAddress(handle, name)#else#include <dlfcn.h>#include <pthread.h>#include <linux/unistd.h>#include <sys/syscall.h>#include <iconv.h>#include<fcntl.h>#include<sys/types.h>#include<unistd.h>typedef void * HandleType;#define LoadLib(filename) dlopen(filename,RTLD_NOW)#define UnLoadLib(handle) dlclose(handle)#define GetProcessAddressByName(handle,name) dlsym(handle,name)#endifclass LoadLibRAII{public: HandleType GetHandle() { return handle_; } LoadLibRAII(const char * name) { handle_ = LoadLib(name); } ~LoadLibRAII() { if (handle_) { UnLoadLib(handle_); } }private: HandleType handle_;};
注意事项:(转自:http://blog.csdn.net/g5dsk/article/details/6680698)
使用 GetProcAddress Function 时,有以下几点需要特别留意:
- 第二个参数类型是 LPCSTR,不是
**LPCTSTR**; - 用 declspec(dllexport),按 C 名称修饰(extern “C”) 导出的函数名,对于 stdcall 和 fastcall 调用约定是相同的;对 __cdecl 是不同的(导出的函数名没有前面的下划线);
- 即使返回值不是 NULL,也有可能发生错误。当 .def 模块不是连续地从 1 开始编号 ordinal 值,那么,如果用一个无函数对应的 ordinal 值调用 GetProcAddress,就会发生错误,返回一个无效的非 NULL 地址;
- 最好用函数名,而不是 ordinal 值调用 GetProcAddress,以避免不同版本 Dll 中某些函数不存在的情况。
注:确认 Dll 的导出函数名,可以用 DUMPBIN /EXPORTS dll_file_name.dll 命令,然后查看name 列。
疑问:
情景:导出类,类的方法在不同的dll中实现不同。在相应的dll中存在一个函数,返回一个该dll实现中相应类的指针。使用GetProcAddress 获取次函数,然后执行吗,获取类指针,然后用此指针调用相关的方法。
干扰点:通过上述两种方法获取的指针调用不同实现的同一方法,结果是一样的
分析:(待查)
此处若在编译过程中不添加生成dll时相关的lib则不能通过编译。在编译的时候决定的相关的执行函数是什么!
自己判断依据,编译时,添加一个lib就可以通过,添加哪一个lib就会执行那一个类方法!
待查!!!!!
linux下使用dl库
相关查dlopen/dlclose/dlsym
上述疑问相关代码:
namespace test{ //导出类 class DLL_API SimpleDll { public: SimpleDll(); ~SimpleDll(); int add(int x, int y); //简单方法 }; extern "C" { DLL_API int getAddRet(int, int); DLL_API SimpleDll* getObj(); }}
//在两个dll中add的实现int SimpleDll::add(int x, int y){ int ret = x + y; return ret;}int SimpleDll::add(int x, int y){ int ret = x + y + 2; return ret;}SimpleDll* getObj(){ return new SimpleDll; //每一个dll中都返回相应的类指针}
0 0
- 根据函数名载入库函数(GetProcAddress、dlsym)
- 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
- 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
- GetProcAddress函数
- GetProcAddress函数
- dlsym函数
- dlsym函数
- GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址
- 自定义实现GetProcAddress函数
- GetProcAddress函数用法
- 根据函数名动态调用
- 函数说明(LoadLibrary 、GetProcAddress、FreeLibrary) 08.10.31
- Linux常用的库函数dlopen/dlsym
- dlopen, dlsym等动态链接库函数解析
- dlopen/dlsym函数
- 根据PE文件格式获取LoadLibraryA()/GetProcAddress()地址
- 根据PE文件格式获取LoadLibraryA()/GetProcAddress()地址
- 根据PE文件格式获取LoadLibraryA()/GetProcAddress()地址
- 在子线程中new Handler报错--Can't create handler inside thread that has not called Looper.prepare()
- 线程和进程
- 宅急送 项目第十二天 项目总结
- 视图层
- Java RMI (Remote Method Invoke 远程方法调用)
- 根据函数名载入库函数(GetProcAddress、dlsym)
- 使用安卓手机的NFC功能进行数据读取操作
- 深入探索GCD----关于GCD你不知道的全在这里(二)
- AOP(注解)【理解】【应用】【重点】
- JQuery Show()的效果,看看有没有你需要的!
- ElasticSearch Java API之滚动搜索(Scroll API)
- java Servlet使用c3p0创建多个Mysql数据库连接池,Sevlet使用c3p0创建oracle数据库连接池
- avalon引入一个外部css(link href)ms-href无效
- nagios监控网卡流量