Всем добрый вечер, в общем пытаюсь разобраться с явной загрузкой DLL к проекту и столкнулся с проблемой. Программа не компилируется, а отладчик указывает на ошибку "Вызвано исключение: нарушение доступа для чтения.__imp__GetProcAddress"
Выполнял по Учебнику Литвиненко и сделал по пунктам, а именно:
1)Создал саму DLL и прописал к ней def- файл
2)Библиотеку скомпилировал, ошибок нет
3)Библиотеку добавил к проекту
4)В сообщении WM_CREATE получил дескриптор библиотеки: hDll = LoadLibrary(_T("")), передавая ей в качестве параметра имя DLL-файла.
5)Функцией GetProcAddress() нашел дескриптор иконки, уже загруженной в библиотеке, передавая ей дескриптор иконки как текстовую строку: hIcon = ((HICON)GetProcAddress(hDll, "hIcon")).
6)После этого изменил малую иконку класса окна SetClassLong(hWnd, GCL_HICONSM, (LONG)hIcon).
Сообщение WM_CREATE
case WM_CREATE:
//получение дескриптора библиотеки
hDll = LoadLibrary(_T("dllmain"));
hIcon = *((HICON*)GetProcAddress(hDll,"hIcon"));
SetClassLong(hWnd, GCL_HICONSM, (LONG)hIcon);
В заголовка объявил импорт: __declspec(dllimport) HICON hIcon;
Содержание DLL файла:
#include "stdafx.h" #include "resource.h"
__declspec(dllexport) HICON hIcon;
BOOL APIENTRY dllmain(HMODULE hModule, //дескриптор библиотеки
DWORD u1_reason_for_call, //код уведомления
LPVOID lpReserved //зарезеврировано
)
{
switch (u1_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hIcon = LoadIcon(hModule, MAKEINTRESOURCE(IDI_ICON1));
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
DestroyIcon(hIcon);
break;
}
return TRUE;
}
Содержание def - файла
EXPORTS hIcon
LoadLibrary(_T("dllmain"));
следует явно вызвать wide char версию:
LoadLibraryW(L"dllmain");
LoadLibrary
надо проверять перед использованием hDll
GetProcAddress
надо проверять перед использованием возвращенного указателяhIcon DATA
dllmain
ни в коем случае не следует вызывать функции вроде LoadIcon
, вместо этого напишите и вызывайте три отдельные функции - init_library
, uninit_library
и get_icon
, а сам dllmain
не нужен.SetClassLong
следует использовать SetClassLongPtr
, иначе указатели / дескрипторы будут обрезаться.(LONG)hIcon
следует использовать reinterpret_cast<::LONG_PTR>(hIcon)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Здраствуйте, есть класс очереди на основе односвязного списка, в случае, если find возвращает false или использования swap почему-то не выводятся...
Ищет в контейнере элементы, эквивалентные val, и возвращает количество совпадений
Как реализовать правильно функцию удаления вершины? Если возможно помогите кодом