根据函数名载入库函数(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 时,有以下几点需要特别留意:

  1. 第二个参数类型是 LPCSTR,不是 **LPCTSTR**
  2. declspec(dllexport),按 C 名称修饰(extern “C”) 导出的函数名,对于 stdcall 和 fastcall 调用约定是相同的;对 __cdecl 是不同的(导出的函数名没有前面的下划线);
  3. 即使返回值不是 NULL,也有可能发生错误。当 .def 模块不是连续地从 1 开始编号 ordinal 值,那么,如果用一个无函数对应的 ordinal 值调用 GetProcAddress,就会发生错误,返回一个无效的非 NULL 地址;
  4. 最好用函数名,而不是 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
原创粉丝点击