实现C++ style的动态库函数加载器

来源:互联网 发布:java程序员的工作内容 编辑:程序博客网 时间:2024/06/08 08:15

动态库的动态加载在底层c运行库提供了三个函数 dlopen、dlsym、dlclose,非常简洁高效,但如果使用c++的方式,应该可以做到更好的易用性,或者更好的类型安全。

因此我们尝试了通过将动态库的导出方法通过定义类来固化,并且能使用c++模板来自动实现这些方法。

比如动态库memory.dll,包含了三个内存管理方法malloc,free,calloc,我们将这个库封装成了如下的Memory类:

struct Memory : DLL<Memory>{    IMPORT(malloc, (void*(*)(size_t)));    IMPORT(free, (void(*)(void*)));    IMPORT(calloc, (void*(*)(size_t,size_t)));};

通过这个Memory类,通过声明的方式固化了动态库导出函数信息,并且可以动态加载对应库并调用其方法了:

    Memory::open("/usr/local/lib/memory.dll", RTLD_LAZY); //动态加载dll库    void *pBuff = Memory::malloc(1024);                   //调用动态库的导出方法    Memory::free(pBuff);    Memory::close();

看起来是不是很酷:)

所有的秘密就藏在基类的DLL模板里,未完待续....






0 0
原创粉丝点击