Явное подключение библиотеки DLL С++ WINAPI

306
01 июля 2018, 09:30

Всем добрый вечер, в общем пытаюсь разобраться с явной загрузкой 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
Answer 1
  • Вместо LoadLibrary(_T("dllmain")); следует явно вызвать wide char версию: LoadLibraryW(L"dllmain");
  • Результат LoadLibrary надо проверять перед использованием hDll
  • Результат GetProcAddress надо проверять перед использованием возвращенного указателя
  • При экспорте данных следует указать hIcon DATA
  • В dllmain ни в коем случае не следует вызывать функции вроде LoadIcon, вместо этого напишите и вызывайте три отдельные функции - init_library, uninit_library и get_icon, а сам dllmain не нужен.
  • про name mangling не забываем
  • Вместо SetClassLong следует использовать SetClassLongPtr, иначе указатели / дескрипторы будут обрезаться.
  • Вместо (LONG)hIcon следует использовать reinterpret_cast<::LONG_PTR>(hIcon)
READ ALSO
Очередь, указатель, for_each

Очередь, указатель, for_each

Здраствуйте, есть класс очереди на основе односвязного списка, в случае, если find возвращает false или использования swap почему-то не выводятся...

220
класс set с++ не могу понять функцию count();

класс set с++ не могу понять функцию count();

Ищет в контейнере элементы, эквивалентные val, и возвращает количество совпадений

206
Удаление вершины с графа

Удаление вершины с графа

Как реализовать правильно функцию удаления вершины? Если возможно помогите кодом

184