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

jopen 10年前

DynamicLib,极简的方式从dll或者so文件获取导出(C)函数。下面展示的是一个简单的例子。

最多支持13个参数

#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));      DEFINE_CDECL_FUNCTION(Func10, void(int, int, int, int, int, int, int, int, int, int));      DEFINE_CDECL_FUNCTION(Func11, void(int, int, int, int, int, int, int, int, int, int, int));      DEFINE_CDECL_FUNCTION(Func12, void(int, int, int, int, int, int, int, int, int, int, int, int));      DEFINE_CDECL_FUNCTION(Func13, void(int, int, int, int, int, int, int, int, int, int, int, int, int));        // 最多不能超过13个参数 >> error C2027: 使用了未定义类型“_Get_TypeGroup<_Tx>”      // DEFINE_CDECL_FUNCTION(Func14, void(int, int, int, int, int, 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<_Null>();        // 调用参数太少      // A().Func1<_Null>();        A().Func1<_Null>(1);        // 调用参数太少      // A().Func2<_Null>();       // A().Func2<_Null>(1);        A().Func2<_Null>(1, 2);        // 调用参数太少      // A().Func3<_Null>();       // A().Func3<_Null>(1);      // A().Func3<_Null>(1, 2);        A().Func3<_Null>(1, 2, 3);        // 调用参数太少      // A().Func4<_Null>();       // A().Func4<_Null>(1);      // A().Func4<_Null>(1, 2);      // A().Func4<_Null>(1, 2, 3);        A().Func4<_Null>(1, 2, 3, 4);        // 调用参数太少      // A().Func5<_Null>();       // A().Func5<_Null>(1);      // A().Func5<_Null>(1, 2);      // A().Func5<_Null>(1, 2, 3);      // A().Func5<_Null>(1, 2, 3, 4);        A().Func5<_Null>(1, 2, 3, 4, 5);        // 调用参数太少      // A().Func6<_Null>();       // A().Func6<_Null>(1);      // A().Func6<_Null>(1, 2);      // A().Func6<_Null>(1, 2, 3);      // A().Func6<_Null>(1, 2, 3, 4);      // A().Func6<_Null>(1, 2, 3, 4, 5);        A().Func6<_Null>(1, 2, 3, 4, 5, 6);        // 调用参数太少      // A().Func7<_Null>();       // A().Func7<_Null>(1);      // A().Func7<_Null>(1, 2);      // A().Func7<_Null>(1, 2, 3);      // A().Func7<_Null>(1, 2, 3, 4);      // A().Func7<_Null>(1, 2, 3, 4, 5);      // A().Func7<_Null>(1, 2, 3, 4, 5, 6);        A().Func7<_Null>(1, 2, 3, 4, 5, 6, 7);        // 调用参数太少      // A().Func8<_Null>();      // A().Func8<_Null>(1, 2);      // A().Func8<_Null>(1, 2, 3);      // A().Func8<_Null>(1, 2, 3, 4);      // A().Func8<_Null>(1, 2, 3, 4, 5);      // A().Func8<_Null>(1, 2, 3, 4, 5, 6);      // A().Func8<_Null>(1, 2, 3, 4, 5, 6, 7);        A().Func8<_Null>(1, 2, 3, 4, 5, 6, 7, 8);        // 调用参数太少      // A().Func9<_Null>();       // A().Func9<_Null>(1);      // A().Func9<_Null>(1, 2);      // A().Func9<_Null>(1, 2, 3);      // A().Func9<_Null>(1, 2, 3, 4);      // A().Func9<_Null>(1, 2, 3, 4, 5);      // A().Func9<_Null>(1, 2, 3, 4, 5, 6);      // A().Func9<_Null>(1, 2, 3, 4, 5, 6, 7);      // A().Func9<_Null>(1, 2, 3, 4, 5, 6, 7, 8);        A().Func9<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9);        // 调用参数太少      // A().Func10<_Null>();       // A().Func10<_Null>(1);      // A().Func10<_Null>(1, 2);      // A().Func10<_Null>(1, 2, 3);      // A().Func10<_Null>(1, 2, 3, 4);      // A().Func10<_Null>(1, 2, 3, 4, 5);      // A().Func10<_Null>(1, 2, 3, 4, 5, 6);      // A().Func10<_Null>(1, 2, 3, 4, 5, 6, 7);      // A().Func10<_Null>(1, 2, 3, 4, 5, 6, 7, 8);      // A().Func10<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9);        A().Func10<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);        // 调用参数太少      // A().Func11<_Null>();       // A().Func11<_Null>(1);      // A().Func11<_Null>(1, 2);      // A().Func11<_Null>(1, 2, 3);      // A().Func11<_Null>(1, 2, 3, 4);      // A().Func11<_Null>(1, 2, 3, 4, 5);      // A().Func11<_Null>(1, 2, 3, 4, 5, 6);      // A().Func11<_Null>(1, 2, 3, 4, 5, 6, 7);      // A().Func11<_Null>(1, 2, 3, 4, 5, 6, 7, 8);      // A().Func11<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9);      // A().Func11<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);        A().Func11<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1);        // 调用参数太少      // A().Func12<_Null>();       // A().Func12<_Null>(1);      // A().Func12<_Null>(1, 2);      // A().Func12<_Null>(1, 2, 3);      // A().Func12<_Null>(1, 2, 3, 4);      // A().Func12<_Null>(1, 2, 3, 4, 5);      // A().Func12<_Null>(1, 2, 3, 4, 5, 6);      // A().Func12<_Null>(1, 2, 3, 4, 5, 6, 7);      // A().Func12<_Null>(1, 2, 3, 4, 5, 6, 7, 8);      // A().Func12<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9);      // A().Func12<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);      // A().Func12<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1);        A().Func12<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2);        // 调用参数太少      // A().Func13<_Null>();       // A().Func13<_Null>(1);      // A().Func13<_Null>(1, 2);      // A().Func13<_Null>(1, 2, 3);      // A().Func13<_Null>(1, 2, 3, 4);      // A().Func13<_Null>(1, 2, 3, 4, 5);      // A().Func13<_Null>(1, 2, 3, 4, 5, 6);      // A().Func13<_Null>(1, 2, 3, 4, 5, 6, 7);      // A().Func13<_Null>(1, 2, 3, 4, 5, 6, 7, 8);      // A().Func13<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9);      // A().Func13<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);      // A().Func13<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1);      // A().Func13<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2);        A().Func13<_Null>(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3);        //////////////////////////////////////////////////////////////////////////        RECT rcWnd;        // 动态存储懒加载      ShareUser32 mUser32;      HWND hWnd = mUser32.GetDesktopWindow<_Null>();      mUser32.GetClientRect<_Null>(hWnd, &rcWnd);      mUser32.Free();        // 静态存储懒加载      hWnd = StaticUser32::GetDesktopWindow<_Null>();      StaticUser32::GetClientRect<_Null>(hWnd, &rcWnd);      StaticUser32::Free();        //////////////////////////////////////////////////////////////////////////        DllTest DllTestInst;        // 动态存储切换加载资源      DllTestInst.Load("DllTestOne.dll");      assert(1 == DllTestInst.fnDllTest<_Null>());      DllTestInst.Free();        // 动态存储切换加载资源      DllTestInst.Load("DllTestTwo.dll");      assert(2 == DllTestInst.fnDllTest<_Null>());      DllTestInst.Free();        return 0;  }

项目主页:http://www.open-open.com/lib/view/home/1427077931902