Как dll импортировать и экспортировать HINSTANCE из .dll в С++?

avatar
anom1
8 августа 2021 в 21:27
150
2
0

Я пытаюсь получить HINSTANCE для .dll, но получаю следующую ошибку:

ошибка LNK2019: неразрешенный внешний символ "__declspec(dllimport) struct HINSTANCE__ * m_instance" (__imp_?m_instance@@3PEAUHINSTANCE__@@EA), указанный в функции...

Это код .dll:

#include <Windows.h>

__declspec(dllexport) HINSTANCE m_instance;

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID)
{
    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        m_instance = (HINSTANCE)hModule;
    }

    return TRUE;
}

Это код приложения:

__declspec(dllimport) HINSTANCE m_instance;

// use it for whatev

В общем, мне нужен способ получить HINSTANCE из моего .dll в мой .exe.

Источник
Vlad Feinstein
8 августа 2021 в 23:49
0

Как связать эту DLL?

Ответы (2)

avatar
Remy Lebeau
8 августа 2021 в 21:39
3

В общем, мне нужен способ получить HINSTANCE из моего .dll в мой .exe.

Но почему??? Как только .exe загрузил .dll в свою память, .exe уже имеет доступ к .dll <4430561645454> значения <4430561645454> из <4430561645454> из <443050561645454> либо из <443050561645454>, GetModuleHandle()>. Таким образом, никогда нет необходимости .dll экспортировать собственный HINSTANCE.

RbMm
8 августа 2021 в 21:56
0

возможно dll статично связана с exe, в этом случае у нас нет базы dll, но непонятно для чего это может быть нужно. однако всегда можно получить это, используя любой экспортированный адрес функции из dll (GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (PCWSTR)SomeFuncFromDll, &hmod);). формально нужно смотреть реально экспортированное имя из dll. возможно, это c скомпилировано как результат не в форме __imp_?m_instance@@3PEAUHINSTANCE__@@EA

Remy Lebeau
8 августа 2021 в 22:25
0

@RbMm "возможно, статическая dll связана с exe, в этом случае у нас нет базы dll" - Да, вы все равно можете получить DLL HINSTANCE в этом сценарии, используя GetModuleHandle("filename.dll").

IInspectable
9 августа 2021 в 05:49
0

Чтобы это работало, имя DLL должно быть известно в коде. Это создает скрытую зависимость между кодом и системой сборки. Зависимость, которую нельзя проверить во время компиляции.

avatar
IInspectable
9 августа 2021 в 05:43
0

Приложению не удается установить связь с библиотекой импорта DLL. По умолчанию компоновщик MSVC создает библиотеку импорта (LIB) при создании DLL с тем же базовым именем, что и у DLL.

Чтобы позволить компоновщику разрешить символ m_instance, приложению требуется библиотека импорта DLL в виде входного файла компоновщика. См. раздел .Lib Files as Linker Input, чтобы узнать, как добавить входные файлы компоновщика в Visual Studio.

Хотя это и не является строго обязательным, обычно рекомендуется экспортировать символы с использованием связи C. В то время как компоновка C++ в значительной степени не определена и очень специфична для инструментальной цепочки, оформление имен C де-факто стандартизировано. Требуемые изменения крошечные (хотя, опять же, не обязательные):

extern "C" __declspec(dllexport) HINSTANCE m_instance;

и

extern "C" __declspec(dllimport) HINSTANCE m_instance;