# DynamicLib **Repository Path**: aresdice/DynamicLib ## Basic Information - **Project Name**: DynamicLib - **Description**: DynamicLib,极简的方式从dll或者so或者dylib文件获取导出(C)函数。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2015-05-03 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DynamicLib DynamicLib,极简的方式从dll或者so或者dylib文件获取导出(C)函数。下面展示的是一个简单的例子。 ## 最多支持9个参数 #include "ShareStore.h" class A : public BaseDllWrapper { 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 { 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 { 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 { 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; }