極簡的方式從dll或者so文件獲取導出(C)函數

jopen 9年前發布 | 33K 次閱讀 C/C++開發 DynamicLib

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.baiduhome.net/lib/view/home/1427077931902

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