DynamicLib从 dll 和 so 导出函数
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; }
评论