如何从 C++ 中的 .dll 导入和导出 HINSTANCE?

How to dll import and export HINSTANCE from a .dll in c++?

我正在尝试获取 .dllHINSTANCE,但出现此错误:

error LNK2019: unresolved external symbol "__declspec(dllimport) struct HINSTANCE__ * m_instance" (__imp_?m_instance@@3PEAUHINSTANCE__@@EA) referenced in function...

这是.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

In summary, I need a way to get the HINSTANCE from my .dll into my .exe.

但是,为什么???一旦 .exe.dll 加载到其内存中,.exe 已经 可以访问 .dllHINSTANCE,来自 LoadLibrary/Ex()GetModuleHandle() 的 return 值。因此,从不 需要 .dll 导出它自己的 HINSTANCE

应用程序未能link针对 DLL 的导入库。默认情况下,MSVC 的 linker 在生成 DLL 时会生成一个导入库 (LIB),它与 ​​DLL 具有相同的基本名称。

为了让 linker 解析符号 m_instance,应用程序需要 DLL 的导入库作为 linker input file. See .Lib Files as Linker Input 以学习如何添加 linker 输入文件在 Visual Studio.

虽然没有严格要求,但使用 C linkage 导出符号通常是个好主意。虽然 C++ linkage 在很大程度上是未指定的并且非常特定于工具链,但 C 名称修饰实际上是标准化的。所需的更改很小(尽管再次不需要):

extern "C" __declspec(dllexport) HINSTANCE m_instance;

extern "C" __declspec(dllimport) HINSTANCE m_instance;