【发布时间】: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。如果没有找到资源,你会得到 1813ERROR_RESOURCE_TYPE_NOT_FOUND。一堆 User32 函数设置了 LastError。