我正在使用MFC创建基于表单的Visual C ++(我相信的CLI)应用程序。
当用户点击一个按钮时,我使用AfxBeginThread函数启动一个单独的线程。
我在该线程中有一个try / catch块,如果抛出异常,我想用MessageBox提示用户。
当我在MFC成员函数中编写MessageBox时,没有语法错误,但是当我在AfxBeginThread调用的函数中编写MessageBox时,它不喜欢字符串前面的大写字母L,它不会识别MB_ICONEXCLAMATION定义。
例如:
//This compiles just fine
void CMyDialogDlg::OnBnClickedButton1()
{
AfxBeginThread(populateFilesThread,this);
MessageBox(L"Cool, everything is okay", L"Title", MB_ICONEXCLAMATION);
}
//This won't compile, and I am afraid it wouldn't work anyway because it isn't from the main thread
void populateFilesThread()
{
MessageBox(L"Does not compile", L"Would it even work?", MB_ICONEXCLAMATION);
}
编译错误是“错误:类型的参数”const wchar_t *“与”HWND“类型的参数不兼容
和
错误:类型为“long”的参数与“LPCWSTR”类型的参数不兼容
答案 0 :(得分:0)
populateFilesThread
不是类的一部分,因此无法访问局部变量。因此,它不能使用隐式使用 MessageBox
的 m_hwnd
重载 CWnd::MessageBox(LPCTSTR, LPCTSTR, int)
,您必须使用 ::MessageBox(HWND, LPCTSTR, LPCTSTR, int)
这也解释了您收到的错误消息。
您可以安全地将 nullptr
作为 HWND 传递。