CreateDialog 失败,但为啥 GetLastError 返回 0?
Posted
技术标签:
【中文标题】CreateDialog 失败,但为啥 GetLastError 返回 0?【英文标题】:CreateDialog Failed, but why GetLastError returns 0?CreateDialog 失败,但为什么 GetLastError 返回 0? 【发布时间】:2011-09-04 06:20:17 【问题描述】:我正在使用scintilla editor component 为我的项目编写一个编辑器。该编辑器用于内部脚本语言,具有剪切、复制、粘贴等所有基本功能。作为其中一项功能,我还提供搜索功能。理想情况下,当用户按下 Ctrl+F 时,它应该显示以下对话框:
但由于某种原因 CreateDialog API 失败,但 GetLastError 返回 0。 另请注意,我使用的是 Windows 通用控件。
>>创建对话框的代码
HWND CreateFindDialog(HINSTANCE hInstance, HWND hWnd, UINT id)
HWND dlgHwnd = ::CreateDialog(hInstance, MAKEINTRESOURCE(id), hWnd, FindDlgProc);
if(dlgHwnd == NULL)
wchar_t buf [100];
wsprintf (buf, L"Error x%x", GetLastError ());
MessageBox (0, buf, L"CreateDialog", MB_ICONEXCLAMATION | MB_OK);
return(dlgHwnd);
BOOL CALLBACK FindDlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
switch(Msg)
case WM_INITDIALOG:
MessageBox (0, L"in", L"CreateDialog", MB_ICONEXCLAMATION | MB_OK);
return TRUE;
case WM_COMMAND:
switch(wParam)
case IDOK:
EndDialog(hWndDlg, 0);
return TRUE;
break;
return FALSE;
>>对话框的资源条目
IDD_FIND DIALOGEX 0, 0, 304, 90
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Find Text"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "Search String",IDC_STATIC,7,7,44,8
EDITTEXT IDC_FIND_TEXT,7,20,217,14,ES_AUTOHSCROLL
DEFPUSHBUTTON "Find Next",IDC_FIND_NEXT,243,7,54,16,WS_DISABLED
PUSHBUTTON "Find Previous",IDC_FIND_PREVIOUS,243,26,54,16,WS_DISABLED
PUSHBUTTON "Close",IDCANCEL,243,45,54,16
CONTROL "Match case",IDC_FIND_CASE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,42,52,10
CONTROL "Match whole word",IDC_FIND_WHOLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,55,74,10
CONTROL "Wrap around",IDC_FIND_WRAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,116,42,58,10
CONTROL "<a>Goto Replace (Ctrl+H)</a>",IDC_FIND_OPENREPLACE,
"SysLink",WS_TABSTOP,218,70,79,13
END
唯一讨论相同问题的页面是:CreateDialog Failed, but GetLastError return 0。我已经检查了那里提到的解决方案,但在我的项目中我链接到 comctl32.lib。我还检查了我的资源文件和资源头。对话框条目似乎是正确的。
>>通用控件初始化
INITCOMMONCONTROLSEX iccx;
iccx.dwSize = sizeof(INITCOMMONCONTROLSEX);
iccx.dwICC = ICC_WIN95_CLASSES|ICC_COOL_CLASSES|ICC_BAR_CLASSES|ICC_USEREX_CLASSES;
if (!InitCommonControlsEx(&iccx))
return;
任何建议/想法都会有所帮助。谢谢。
【问题讨论】:
你是如何初始化 comctl32 的?你体现了哪个版本? 我问是因为SysLink 需要v6 comctl32。 @David Heffernan:请查看我的更新答案。如果有帮助,我正在使用带有 service pack 1、visual studio 2008 和最新版本的 scintilla 的 windows vista。谢谢。 哪个 comctl32 版本?你有 v6 应用清单吗? @David Heffernan:对不起,我之前没有回答你的问题。我的应用程序正在使用 comctl 版本 5.82。我用这个小代码sn-p找到了davekb.com/… 【参考方案1】:如documentation 所述,SysLink 控件需要 v6 的 comctl32。您正在链接到 v5 comctl32,我怀疑这是您的错误的原因。您需要包含v6 comctl32 application manifest。
【讨论】:
以上是关于CreateDialog 失败,但为啥 GetLastError 返回 0?的主要内容,如果未能解决你的问题,请参考以下文章
来自 CreateWindow/CreateDialog 的 HWND 可以从另一个线程获取消息吗?