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 参数应该是 DLLhInstance,而不是 [=13] =].使用 DllMain() 的第一个参数的值并将其存储在某处。

据我了解,您是在使用 WinMainhInstance 传递给 DLL 吗?

您将错误的 HINSTANCE 传递给 FindResource() and LoadResource() 函数。您正在从 WinMain() 函数传递 HINSTANCE,这仅适用于位于 EXE 文件中的资源。 你想从 DLL 加载资源,所以你必须传递 DLL 的 HINSTANCE,你在 DllMain() 函数中获取它。