【问题标题】:winAPI FindResource returns NULL only inside DLL [closed]winAPI FindResource 仅在 DLL 内返回 NULL [关闭]
【发布时间】:2019-08-27 17:09:48
【问题描述】:

我遇到了一个奇怪的问题。相同的代码在 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 是一个单独的可执行文件(即使它是一个“库”),它有自己的 hinstance 句柄,与应用程序分开。您检索到 DLL 实例句柄了吗?
  • 好吧,伙计们,你们都是对的。它不是 dll 实例句柄,而是应用程序实例句柄。我的问题是,我认为有平等的)))

标签: c++ winapi dll loadlibrary


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在 DLL 中,FindResource(hInst …)HMODULE 参数应该是 DLLhInstance,而不是 WinMain。使用DllMain() 的第一个参数的值并将其存储在某处。

    如果我理解,您使用的是 hInstanceWinMain 传递给 DLL?

    【讨论】:

    • 啊! EylM 以大约 7 秒的优势击败了我! @Eylm - 投赞成票!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2015-08-20
    • 1970-01-01
    • 2014-08-15
    • 2019-01-27
    • 2018-03-10
    相关资源
    最近更新 更多