winAPI FindResource仅在DLL内部返回NULL

时间:2019-08-27 17:09:48

标签: c++ winapi dll loadlibrary

我陷入了一个奇怪的问题。相同的代码可以在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);不为null(至少在调试时)。我在WinMain函数中初始化hInstance,所以它是正确的:

// main function
int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    hInst = hInstance;

我不知道怎么了。 hInstance错了吗?显然,我使用调试器进行了检查。没有变化,值绝对相同。

解决方案:

需要使用DLL实例,而不是应用程序实例。我可以通过DllMain dll函数来获取它。

2 个答案:

答案 0 :(得分:3)

在DLL中,HMODULE的{​​{1}}参数应该是 DLL FindResource(hInst …),而不是hInstance的{​​{1}}。使用WinMain的第一个参数的值并将其存储在某个位置。

据我了解,您使用的是传递给DLL的DllMain()中的hInstance吗?

答案 1 :(得分:3)

您将错误的tblCls <- reactive({ req(input$file1) # if else not needed when using req() head(read.csv(input$file1$datapath, header = input$header), 5) }) output$class <- renderPrint({ str(tblCls()) }) textOutput("class") 传递给FindResource()LoadResource()函数。您正在从HINSTANCE函数传递HINSTANCE,这仅对位于EXE文件中的资源正确。 您要从DLL加载资源,因此必须传递DLL的WinMain(),而必须在DllMain()函数中获取。