当前位置: 首页 > 软件库 > 程序开发 > 常用工具包 >

DynamicLib

从 dll 和 so 导出函数
授权协议 MIT
开发语言 C/C++
所属分类 程序开发、 常用工具包
软件类型 开源软件
地区 国产
投 递 者 谷梁驰
操作系统 Windows
开源组织
适用人群 未知
 软件概览

DynamicLib,极简的方式从dll或者so或者dylib文件获取导出(C)函数。

下面展示的是一个简单的例子。

最多支持9个参数

#include "ShareStore.h"
class A : public BaseDllWrapper<A> {
    DEFINE_CDECL_FUNCTION(Func0, void());
    DEFINE_CDECL_FUNCTION(Func1, void(int));
    DEFINE_CDECL_FUNCTION(Func2, void(int, int));
    DEFINE_CDECL_FUNCTION(Func3, void(int, int, int));
    DEFINE_CDECL_FUNCTION(Func4, void(int, int, int, int));
    DEFINE_CDECL_FUNCTION(Func5, void(int, int, int, int, int));
    DEFINE_CDECL_FUNCTION(Func6, void(int, int, int, int, int, int));
    DEFINE_CDECL_FUNCTION(Func7, void(int, int, int, int, int, int, int));
    DEFINE_CDECL_FUNCTION(Func8, void(int, int, int, int, int, int, int, int));
    DEFINE_CDECL_FUNCTION(Func9, void(int, int, int, int, int, int, int, int, int));
};

动态存储的方式导出User32.dll中的函数

#include "ShareStore.h"
class ShareUser32 : public BaseDllWrapper<ShareUser32> {
    DEFINE_STDCALL_FUNCTION(GetClientRect, BOOL(HWND, LPRECT));
    DEFINE_STDCALL_FUNCTION(GetDesktopWindow, HWND());

    // 动态存储使用懒加载模式
    DEFINE_DEFAULT_FILE("User32.dll");
};

静态存储方式导出User32.dll中的函数

#include "StaticStore.h"
class StaticUser32 : public BaseDllWrapper<StaticUser32> {
    DEFINE_STDCALL_FUNCTION(GetClientRect, BOOL(HWND, LPRECT));
    DEFINE_STDCALL_FUNCTION(GetDesktopWindow, HWND());

    // 静态存储使用懒加载模式
    DEFINE_DEFAULT_FILE("User32.dll");
};

使用动态存储在相同接口不同实现的dll文件间自由切换

#include "ShareStore.h"
class DllTest : public BaseDllWrapper<DllTest> {
    DEFINE_CDECL_FUNCTION(fnDllTest, int());
};

调用示例

int main(int argc, char* argv[])
{
    A().Func0();

    A().Func1();
    A().Func1(1);

    A().Func2();
    A().Func2(1);
    A().Func2(1, 2);

    A().Func3();
    A().Func3(1);
    A().Func3(1, 2);
    A().Func3(1, 2, 3);

    A().Func4();
    A().Func4(1);
    A().Func4(1, 2);
    A().Func4(1, 2, 3);
    A().Func4(1, 2, 3, 4);

    A().Func5();
    A().Func5(1);
    A().Func5(1, 2);
    A().Func5(1, 2, 3);
    A().Func5(1, 2, 3, 4);
    A().Func5(1, 2, 3, 4, 5);

    A().Func6();
    A().Func6(1);
    A().Func6(1, 2);
    A().Func6(1, 2, 3);
    A().Func6(1, 2, 3, 4);
    A().Func6(1, 2, 3, 4, 5);
    A().Func6(1, 2, 3, 4, 5, 6);

    A().Func7();
    A().Func7(1);
    A().Func7(1, 2);
    A().Func7(1, 2, 3);
    A().Func7(1, 2, 3, 4);
    A().Func7(1, 2, 3, 4, 5);
    A().Func7(1, 2, 3, 4, 5, 6);
    A().Func7(1, 2, 3, 4, 5, 6, 7);

    A().Func8();
    A().Func8(1, 2);
    A().Func8(1, 2, 3);
    A().Func8(1, 2, 3, 4);
    A().Func8(1, 2, 3, 4, 5);
    A().Func8(1, 2, 3, 4, 5, 6);
    A().Func8(1, 2, 3, 4, 5, 6, 7);
    A().Func8(1, 2, 3, 4, 5, 6, 7, 8);

    A().Func9();
    A().Func9(1);
    A().Func9(1, 2);
    A().Func9(1, 2, 3);
    A().Func9(1, 2, 3, 4);
    A().Func9(1, 2, 3, 4, 5);
    A().Func9(1, 2, 3, 4, 5, 6);
    A().Func9(1, 2, 3, 4, 5, 6, 7);
    A().Func9(1, 2, 3, 4, 5, 6, 7, 8);
    A().Func9(1, 2, 3, 4, 5, 6, 7, 8, 9);

    //////////////////////////////////////////////////////////////////////////

    RECT rcWnd;

    // 动态存储懒加载
    ShareUser32 mUser32;
    HWND hWnd = mUser32.GetDesktopWindow();
    mUser32.GetClientRect(hWnd, &rcWnd);
    mUser32.Free();

    // 静态存储懒加载
    hWnd = StaticUser32::GetDesktopWindow();
    StaticUser32::GetClientRect(hWnd, &rcWnd);
    StaticUser32::Free();

    //////////////////////////////////////////////////////////////////////////

    char buffer[256];
    getcwd(buffer, sizeof(buffer));

    //////////////////////////////////////////////////////////////////////////

    DllTest DllTestInst;

    // 动态存储切换加载资源
    #ifdef WIN32
        DllTestInst.Load("DllTestOne.dll");
    #else
        StdString OnePath(buffer);
        OnePath.append("/DllTestOne.so");
        DllTestInst.Load(OnePath.c_str());
    #endif
    DllTestInst.fnDllTest();
    DllTestInst.Free();

    // 动态存储切换加载资源
    #ifdef WIN32
        DllTestInst.Load("DllTestTwo.dll");
    #else
        StdString TwoPath(buffer);
        TwoPath.append("/DllTestTwo.so");
        DllTestInst.Load(TwoPath.c_str());
    #endif
    DllTestInst.fnDllTest();
    DllTestInst.Free();

    return 0;
}
 相关资料
  • 问题内容: 我参与了有关Linux库的一些辩论,并想确认一些事情。 以我的理解(如果我做错了请纠正我,稍后我将编辑我的文章)在构建应用程序时有两种使用库的方式: 静态库(.a文件):在链接时,会将整个库的副本放入最终应用程序中,以便调用方应用程序始终可以使用库中的功能 共享对象(.so文件):在链接时,仅通过相应的标头(.h)文件针对其API验证了对象。该库直到需要运行时才真正使用。 静态库的明显

  • 问题内容: 是否可以从Go调用静态对象(.so)文件?我一直在搜寻Google,我不断提出我可以做到的主张 但是尝试这样做会出现错误 并搜索Godocs,但在syscall包中找不到对此功能的引用。是否可以加载库并调用其函数? 问题答案: 在POSIX平台上,您可以用来调用dlopen和朋友:

  • 最近,我构造了我的firebase函数,通过参考另一篇so文章,使目录具有更模块化的方法。 因此,firebase目录结构是 不同模块中的所有文件(除了utils之外)都作为firebase函数单独导出到最上面的index.js中。每个模块的index.js对每个函数进行全局导出。 主要的(最外面的)index.js 现在我想添加另一个模块,但不是该模块的所有功能都需要导出。这些未导出的函数被导入

  • 问题内容: 如何将winDLL导入python并能够使用其所有功能?它只需要双打和字符串。 问题答案: 您已经标记了问题ctype,所以听起来您已经知道答案了。 该ctypes的教程非常出色。阅读并理解该说明后,您将可以轻松完成。 例如: 还有我自己的代码中的一个示例:

  • 我得到“只有void函数可以用'new'关键字调用”。我知道关键字在声明文件中是有效的,例如: 这只是导出一个类型,正如编译器所说:“只引用一个类型,但在这里被用作值”。 我不能在这里使用类,因为API可以通过来自其他文件的插件进行扩展,类型声明合并在类上不起作用(我希望其他文件添加的方法也能够通过它们自己的键入文件进行键入)。 我不知所措-有什么主意吗?

  • 如何从声明中的另一个函数中调用函数? 我试图从函数中访问函数,得到的结果是: TypeError:对象#没有方法“foo” 如果将更改为,将得到: ReferenceError:未定义foo