極簡的方式從dll或者so文件獲取導出(C)函數
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; }
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!