【问题标题】:Create CFrameWnd gives first-chance exceptions--why?Create CFrameWnd 提供了第一次机会异常——为什么?
【发布时间】:2015-05-05 19:51:12
【问题描述】:

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

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

这段代码有什么问题? 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)
{
}

【问题讨论】:

  • 这可能是由在您的桌面上运行的应用程序引起的,它安装了一个全局挂钩或导致代码在您的进程中使用其他基础设施运行。在处理程序内部引发异常,然后被捕获(否则您会看到第二次机会异常,以及 未捕获异常 对话框)。要解决此问题,您必须识别有故障的应用程序,并将其从系统中删除。除此之外,您的代码没有任何问题。阅读 Prosise 是学习 MFC 的正确方式。
  • 抛出了什么异常?正如 IInspectable 所说,它可能是由某种类型的代码注入到您的进程中引起的;如果是这样,您将能够在调用堆栈上看到该 DLL。
  • 输出窗口中的信息是“MainWindowTest.exe 中 0x000007FEFD4B940D 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x00000000025EF130 处的 Win32Util::Error。”像这样有两条相同的行。
  • IInspectable - 有关如何识别故障应用程序的任何建议? Sysinternals 自动运行显示数百个启动,我不确定使用任务管理器终止进程是否会消除错误原因。
  • 这是第一次机会异常时的堆栈(启用 C++ 异常中断): KernelBase.dll!000007fefd4b940d() Unknown pmls64.dll!000000018007b7e6() Unknown pmls64.dll!00000001800095b5 () 未知 pmls64.dll!000000018005af82() 未知 pmls64.dll!000000018005f2c7() 未知 pmls64.dll!000000018005fa11() 未知 pmls64.dll!000000018007db7f() 未知 pmls64.dll!03300000外部代码>

标签: c++ exception mfc


【解决方案1】:

感谢@IInspectable 和@David Ching 的有用建议,我能够找到问题的原因。这是一个名为“Premier Voice”的软件,最近在我不知情的情况下安装了它。

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

此外,这个程序在 Firefox 中安装了一个插件(同样未经许可),我不得不手动删除它。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2014-06-27
    相关资源
    最近更新 更多