1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/lvan100-DynamicLib

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Динамическая библиотека

DynamicLib — это способ получения экспортируемых функций (C) из файлов dll, so или dylib. Ниже приведён простой пример.

Динамический способ экспорта функций из User32.dll

struct ShareUser32 {
    ShareUser32();
    DllFunc<HWND()> GetDesktopWindow;
    DllFunc<BOOL(HWND, LPRECT)> GetClientRect;
};

ShareUser32::ShareUser32()
    : GetClientRect("User32.dll", "GetClientRect", DllFuncType::DTF_STDCALL)
    , GetDesktopWindow("User32.dll", "GetDesktopWindow", DllFuncType::DTF_STDCALL)
{}

Статический способ экспорта функций из User32.dll

struct StaticUser32 {
    static DllFunc<HWND()> GetDesktopWindow;
    static DllFunc<BOOL(HWND, LPRECT)> GetClientRect;
};

DllFunc<HWND()> StaticUser32::GetDesktopWindow("User32.dll", "GetDesktopWindow", DllFuncType::DTF_STDCALL);
DllFunc<BOOL(HWND, LPRECT)> StaticUser32::GetClientRect("User32.dll", "GetClientRect", DllFuncType::DTF_STDCALL);

С помощью динамического способа можно легко переключаться между различными реализациями в файлах dll

struct DllTest {
    DllFunc<int()> fnDllTest;
    DllTest() : fnDllTest("fnDllTest") {}
};

Пример вызова

int main(int argc, char* argv[]) {

#ifdef WIN32

    RECT rcWnd;

    // Динамическое хранение и ленивая загрузка
    ShareUser32 mUser32;
    HWND hWnd = mUser32.GetDesktopWindow();
    mUser32.GetClientRect(hWnd, &rcWnd);

    // Статическое хранение и ленивая загрузка
    hWnd = StaticUser32::GetDesktopWindow();
    StaticUser32::GetClientRect(hWnd, &rcWnd);

#endif

    char buffer[256];
    _getcwd(buffer, sizeof(buffer));

    //////////////////////////////////////////////////////////////////////////

    DllTest DllTestInst;

    // Динамическое хранилище и переключение загрузки ресурсов
#ifdef WIN32
    DllTestInst.fnDllTest.Load("DllTestOne.dll");
#else
    std::string OnePath(buffer);
#ifdef __APPLE__
    OnePath.append("/DllTestOne.dylib");
#else
    OnePath.append("/DllTestOne.so");
#endif
    DllTestInst.fnDllTest.Load(OnePath.c_str());
#endif

DllTestInst.fnDllTest();
DllTestInst.fnDllTest.Free();

    // Динамическое хранилище и переключение загрузки ресурсов
#ifdef WIN32
    DllTestInst.fnDllTest.Load("DllTestTwo.dll");
#else
    std::string TwoPath(buffer);
#ifdef __APPLE__
    TwoPath.append("/DllTestTwo.dylib");
#else
    TwoPath.append("/DllTestTwo.so");
#endif
    DllTestInst.fnDllTest.Load(TwoPath.c_str());
#endif
    DllTestInst.fnDllTest();
    DllTestInst.fnDllTest.Free();

    return 0;
}

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

DynamicLib — это способ получения экспортируемых функций (C) из файлов dll, so или dylib в минималистичном стиле. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/lvan100-DynamicLib.git
git@api.gitlife.ru:oschina-mirror/lvan100-DynamicLib.git
oschina-mirror
lvan100-DynamicLib
lvan100-DynamicLib
master