winAPI FindResource returns NULL 仅在 DLL 内部
winAPI FindResource returns NULL only inside DLL
我遇到了一个奇怪的问题。相同的代码在 dll 外部工作完美,但在 dll 内部不工作。
dll 中的代码。错误和空值:
// 1813 here
HRSRC hrsrc = FindResourceW(hInstance,
MAKEINTRESOURCE(IDD_DIALOG1),
RT_DIALOG);
// NULL here.
HGLOBAL hg = LoadResource(hInstance, hrsrc);
外部dll,一切正常:
// Pointer here, all fine
HRSRC hrsrc = FindResourceW(hInstance,
MAKEINTRESOURCE(IDD_DIALOG1),
RT_DIALOG);
// Pointer here.
HGLOBAL hg = LoadResource(hInstance, hrsrc);
该资源确实存在于 dll 资源中,我检查并重新创建了我的资源文件。并且在这两种情况下都可以编译,没有 Symbol not resolved
错误。
是的,我将 hInstance
参数传递给 dll 函数。 double* arr = ShowXMinXMaxDialogDisableParent(hInst, hWnd, xMin, xMax);
它不为空(至少在调试时)。我在 WinMain 函数中初始化 hInstance
,所以它是正确的:
// main function
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
hInst = hInstance;
我不知道出了什么问题。 hInstance 错误?很明显,我用调试器检查了它。没有变化,值完全一样。
解法:
需要使用DLL实例,而不是应用程序实例。我可以在 DllMain dll 函数中得到它。
在 DLL 中,FindResource(hInst …)
的 HMODULE
参数应该是 DLL 的 hInstance
,而不是 [=13] =].使用 DllMain()
的第一个参数的值并将其存储在某处。
据我了解,您是在使用 WinMain
的 hInstance
传递给 DLL 吗?
您将错误的 HINSTANCE
传递给 FindResource()
and LoadResource()
函数。您正在从 WinMain()
函数传递 HINSTANCE
,这仅适用于位于 EXE 文件中的资源。
你想从 DLL 加载资源,所以你必须传递 DLL 的 HINSTANCE
,你在 DllMain()
函数中获取它。
我遇到了一个奇怪的问题。相同的代码在 dll 外部工作完美,但在 dll 内部不工作。
dll 中的代码。错误和空值:
// 1813 here
HRSRC hrsrc = FindResourceW(hInstance,
MAKEINTRESOURCE(IDD_DIALOG1),
RT_DIALOG);
// NULL here.
HGLOBAL hg = LoadResource(hInstance, hrsrc);
外部dll,一切正常:
// Pointer here, all fine
HRSRC hrsrc = FindResourceW(hInstance,
MAKEINTRESOURCE(IDD_DIALOG1),
RT_DIALOG);
// Pointer here.
HGLOBAL hg = LoadResource(hInstance, hrsrc);
该资源确实存在于 dll 资源中,我检查并重新创建了我的资源文件。并且在这两种情况下都可以编译,没有 Symbol not resolved
错误。
是的,我将 hInstance
参数传递给 dll 函数。 double* arr = ShowXMinXMaxDialogDisableParent(hInst, hWnd, xMin, xMax);
它不为空(至少在调试时)。我在 WinMain 函数中初始化 hInstance
,所以它是正确的:
// main function
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
hInst = hInstance;
我不知道出了什么问题。 hInstance 错误?很明显,我用调试器检查了它。没有变化,值完全一样。
解法:
需要使用DLL实例,而不是应用程序实例。我可以在 DllMain dll 函数中得到它。
在 DLL 中,FindResource(hInst …)
的 HMODULE
参数应该是 DLL 的 hInstance
,而不是 [=13] =].使用 DllMain()
的第一个参数的值并将其存储在某处。
据我了解,您是在使用 WinMain
的 hInstance
传递给 DLL 吗?
您将错误的 HINSTANCE
传递给 FindResource()
and LoadResource()
函数。您正在从 WinMain()
函数传递 HINSTANCE
,这仅适用于位于 EXE 文件中的资源。
你想从 DLL 加载资源,所以你必须传递 DLL 的 HINSTANCE
,你在 DllMain()
函数中获取它。