创建CFrameWnd会给出第一次机会异常 - 为什么?

时间:2015-03-04 17:30:43

标签: c++ exception mfc

我正在尝试编写一个简单的MFC应用程序,该应用程序使用基于CFrameWnd的代码绘制可滚动窗口。下面的代码改编自Prosise“Programming Windows with MFC”,2nd ed,pp 89ff。

当我在调试器中运行它时,我得到两个第一次机会异常。如果我忽略这些,窗口会按预期显示,我可以在其中绘制。如果我在“C ++异常”上启用break,我得到的堆栈只是“内部”代码,我没有源代码。通过单步执行代码,我发现在CreateWindowEx的调用中,CWnd :: CreateEx中发生异常。

这段代码有什么问题? 64位Windows 7,Visual Studio 2013更新4.这是一个调试版本,x64,在静态库中使用MFC,使用多字节字符集,使用多线程调试运行时(/ MTd)。

// Viewer.h
#include <afxwin.h>

// Adapted from Prosise "Programming Windows with MFC", 2nd ed, pp 89ff.
class CViewerApp : public CWinApp
{
public:
    virtual BOOL InitInstance();

};

class CMainWindow : public CFrameWnd
{
public:
    CMainWindow();
protected:
    afx_msg void OnPaint();
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnHScroll(UINT nCode, UINT nPos, CScrollBar *pScrollBar);
    afx_msg void OnVScroll(UINT nCode, UINT nPos, CScrollBar *pScrollBar);

public:

    DECLARE_MESSAGE_MAP()
};

// Viewer.cpp: Display
#include <afxwin.h>
#include "Viewer.h"

CViewerApp myApp;

BOOL CViewerApp::InitInstance()
{
    m_pMainWnd = new CMainWindow;
    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow();

    return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
    ON_WM_CREATE()
    ON_WM_SIZE()
    ON_WM_PAINT()
    ON_WM_HSCROLL()
    ON_WM_VSCROLL()
END_MESSAGE_MAP()

CMainWindow::CMainWindow()
{
    Create(NULL, "Viewer", WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL | WS_MAXIMIZE);
}

int CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if(CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    return 0;
}

void CMainWindow::OnPaint()
{
}

void CMainWindow::OnSize(UINT nType, int cx, int cy)
{
    //TO DO
}
void CMainWindow::OnHScroll(UINT nCode, UINT nPos, CScrollBar *pScrollBar)
{
}

void CMainWindow::OnVScroll(UINT nCode, UINT nPos, CScrollBar *pScrollBar)
{
}

1 个答案:

答案 0 :(得分:0)

感谢来自@IInspectable和@David Ching的有用建议,我能够找到问题的原因。这是一款名为&#34; Premier Voice&#34;的软件,最近在我不知情的情况下安装。

我使用Process Explorer跟踪pmls64.dll的使用情况,并使用任务管理器和autoruns来查找可执行文件。该程序安装在自己的文件夹中的程序(x86)中,并进行了卸载,我使用了它。然后我不得不手动删除程序(x86)中的文件夹,并删除几个注册表项。

此外,该程序还安装了Firefox的附加组件(再次未经许可),我必须手动删除。

除了它在我自己的软件中造成的例外情况之外,我怀疑Premier Voice是在今天弹出一个窗口,询问我这台计算机的每个用户的出生日期和性别。