DialogBoxW在DLL中不起作用,但在exe中起作用

时间:2018-06-23 17:39:24

标签: c++ dll dialog

我一直试图创建一个创建对话框的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中不能正常工作?

1 个答案:

答案 0 :(得分:0)

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

如果它驻留在应用程序中,则需要执行以下操作:

DialogBoxW (NULL, ...);

但是,如果它驻留在DLL中,则需要这样做:

DialogBoxW (hInst, ...);

hInst == hinstDLL时,dwReason设置为传递给DllMain()DLL_PROCESS_ATTACH的值(如注释中所示)。 / p>

此外,在您的CreateThread ()中对DllMain的呼叫看起来非常可疑。怎么办? (请将信息添加到您的问题中,谢谢)。