如何从 C++ 中的 .dll 导入和导出 HINSTANCE?
How to dll import and export HINSTANCE from a .dll in c++?
我正在尝试获取 .dll
的 HINSTANCE
,但出现此错误:
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
已经 可以访问 .dll
的 HINSTANCE
,来自 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;
我正在尝试获取 .dll
的 HINSTANCE
,但出现此错误:
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
已经 可以访问 .dll
的 HINSTANCE
,来自 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;