我有以下代码:
Main.h
#pragma once
#include <wx\wxwidgets.h>
class Main : public wxApp {
public:
virtual bool OnInit();
};
的main.cpp
#include "Main.h"
bool Main::OnInit() {
wxMessageDialog *test= new wxMessageDialog(nullptr, wxT("Test"));
test->ShowModal();
return true;
}
wxIMPLEMENT_APP(Main);
我正在使用wxWidgets 3.0.3并使用here提供的说明设置项目(Visual Studio 2017)。
有趣的是,我wxFileDialog
正常工作,没有问题,所以我怀疑图书馆没有正确设置。
当我尝试执行上面的代码时,我在msgdlg.cpp
的第594行(这是库的一部分,我假设)中获得了访问冲突读取位置异常:
int wxMessageDialog::ShowModal()
{
WX_HOOK_MODAL_DIALOG();
#ifdef wxHAS_MSW_TASKDIALOG
if ( HasNativeTaskDialog() )
{
TaskDialogIndirect_t taskDialogIndirect = GetTaskDialogIndirectFunc();
wxCHECK_MSG( taskDialogIndirect, wxID_CANCEL, wxS("no task dialog?") );
WinStruct<TASKDIALOGCONFIG> tdc;
wxMSWTaskDialogConfig wxTdc( *this );
wxTdc.MSWCommonTaskDialogInit( tdc );
int msAns;
--THIS->HRESULT hr = taskDialogIndirect( &tdc, &msAns, NULL, NULL );
if ( FAILED(hr) )
{
wxLogApiError( "TaskDialogIndirect", hr );
return wxID_CANCEL;
}
// In case only an "OK" button was specified we actually created a
// "Cancel" button (see comment in MSWCommonTaskDialogInit). This
// results in msAns being IDCANCEL while we want IDOK (just like
// how the native MessageBox function does with only an "OK" button).
if ( (msAns == IDCANCEL)
&& !(GetMessageDialogStyle() & (wxYES_NO|wxCANCEL)) )
{
msAns = IDOK;
}
return MSWTranslateReturnCode( msAns );
}
#endif // wxHAS_MSW_TASKDIALOG
return ShowMessageBox();
}
我设置了一个断点,进入该功能时失败了。由于msAns
刚刚创建,我怀疑这是一个问题,因此唯一可能的罪魁祸首是tdc
。
这有什么意义吗? 我如何使其工作? 它是库中的错误吗?
修改
经过进一步检查后,似乎只有在运行x64配置时才会出现问题。 x86配置运行得很好。
我知道我没有切换x86和x64二进制文件,因为我一次复制了整个输出(vc_lib和vc_x64_lib文件夹,它在内部处理它们),此外,我预计x86版本会出现问题虽然x64在这种情况下可以正常工作,但不是相反。
是什么给出了?