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