Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Динамически подключаемые библиотеки (DLL)

#cpp #winapi #dll #cpp_faq


Как динамически подключить библиотеку DLL на С++?
    


Ответы

Ответ 1



Воспользуйтесь поиском и найдете ответы. К примеру: Работа с библиотеками динамической компоновки (DLL) Использование DLL в программе на Visual C++ Неявное подключение Это наиболее простой метод подключения DLL к программе. Все, что нужно - это передать линкеру имя библиотеки импорта, чтобы он использовал ее в процессе сборки. Сделать это можно различными способами. Во-первых, можно непосредственно добавить файл MyDll.lib в проект посредством команды Project->Add to project->Files... Во-вторых, можно указать имя библиотеки импорта в опциях линкера. Для этого откройте окно настроек проекта (Project->Settings...) и добавьте в поле Object/Library modules на вкладке Link имя MyDll.lib. Наконец, можно встроить ссылку на библиотеку импорта прямо в исходный код программы. Для этого используется директива #pragma c ключем comment. #pragma comment(lib,"MyDll.lib") Явное подключение При явном подключении DLL программист должен сам позаботиться о загрузке библиотеки перед ее использованием. Для этого используется функция LoadLibrary, которая получает имя библиотеки и возвращает ее дескриптор. Дескриптор необходимо сохранить в переменной, так как он будет использоваться всеми остальными функциями, предназначенными для работы с DLL. HMODULE hLib; hLib = LoadLibrary("MyDll.dll");

Ответ 2



Пример -- в эмуляторе я решил вынести функцию отрисовки экрана в отдельную DLL. Объявления и переменные: typedef void (CALLBACK* RENDER_DRAW_CALLBACK)(const void * pixels, HDC hdcTarget); HMODULE g_hModuleRender = NULL; RENDER_DRAW_CALLBACK RenderDrawProc = NULL; В начале работы: g_hModuleRender = ::LoadLibrary(szRenderLibraryName); if (g_hModuleRender == NULL) { //TODO: Отрабатываем ситуацию "не смогли загрузить DLL", показываем ::GetLastError() } RenderDrawProc = (RENDER_DRAW_CALLBACK) ::GetProcAddress(g_hModuleRender, "RenderDraw"); if (RenderDrawProc == NULL) { //TODO: Отрабатываем ситуацию "не смогли получить адрес функции из DLL" } Собственно отрисовка: void ScreenView_OnDraw(HDC hdc) { if (RenderDrawProc != NULL) { RenderDrawProc(m_bits, hdc); } } В конце работы: if (g_hModuleRender != NULL) { RenderDrawProc = NULL; ::FreeLibrary(g_hModuleRender); g_hModuleRender = NULL; }

Комментариев нет:

Отправить комментарий