【问题标题】:DialogBoxW Not working in DLL but work in exeDialogBoxW 不在 DLL 中工作,但在 exe 中工作
【发布时间】:2018-06-23 17:39:23
【问题描述】:

我一直在尝试创建一个用于创建对话框的 DLL。当我将其编译为可执行文件时,会显示对话框,但当我尝试将其编译为 DLL 时,对话框不会显示。

LRESULT CALLBACK SubDiag(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch (Msg)
    {
    case WM_CLOSE:
        EndDialog(hDlg, 0);
        break;

    default:
        return FALSE;
        break;
    }

    return false;
}

LRESULT CALLBACK MainDiag(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch (Msg)
    {
    case WM_INITDIALOG:

        break;
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case ID_Button:
            DialogBoxW(hInst, MAKEINTRESOURCEW(IDD_SUB), hDlg, DLGPROC(SubDiag));
            break;
        }
        break;

    case WM_CLOSE:
        EndDialog(hDlg, 0);
        break;

    default:
        return FALSE;
        break;
    }

    return false;
}

DWORD WINAPI Thread(LPVOID dwParam)
{
    HWND _hwnd = CreateDialogW(hInst, MAKEINTRESOURCE(IDD_MAIN), NULL, DLGPROC(MainDiag));
    ShowWindow(_hwnd, SW_SHOW);

    MSG msg = { 0 };
    while (IsWindow(_hwnd) && GetMessage(&msg, NULL, 0, 0))
    {
        if (!IsDialogMessage(_hwnd, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return 0;
}

为什么这在 DLL 中不起作用?

【问题讨论】:

  • 显示对话框所需的代码必须在可执行文件和 DLL 之间有所不同。显示这些差异也可能很有用。
  • 告诉 DLL 启动线程并显示对话框的代码在哪里?
  • hInst 来自哪里?
  • //for DLL BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) { if(dwReason == DLL_PROCESS_ATTACH) { hInst = hModule; CreateThread(NULL, NULL, 线程, NULL, NULL, NULL); } 返回真; } //对于 Exe int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { hInst = hInstance;返回线程(hInst); }
  • @PaulSanders CreateDialog 设置 LastError。如果没有找到资源,你会得到 1813 ERROR_RESOURCE_TYPE_NOT_FOUND。一堆 User32 函数设置了 LastError。

标签: c++ dll dialog


【解决方案1】:

对话框资源是驻留在应用程序还是 DLL 中?

如果它驻留在应用程序中,那么您需要这样做:

DialogBoxW (NULL, ...);

但如果它驻留在 DLL 中,那么你需要这样做:

DialogBoxW (hInst, ...);

其中hInst 设置为hinstDLL 的值,当dwReason == DLL_PROCESS_ATTACH 时传递给DllMain()(如您在评论中所示)。

此外,在您的 DllMain 中调用 CreateThread () 看起来非常可疑。这有什么关系? (请在您的问题中添加信息,谢谢)。

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2010-12-20
    • 2021-04-13
    相关资源
    最近更新 更多