wxWidgets wxMessageDialog抛出访问冲突异常

时间:2017-12-01 18:23:32

标签: c++ wxwidgets

我有以下代码:

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在这种情况下可以正常工作,但不是相反。

是什么给出了?

0 个答案:

没有答案