【问题标题】:Suppress Pure Virtual Function call modal dialog and crash silently [duplicate]抑制纯虚函数调用模式对话框并静默崩溃[重复]
【发布时间】:2014-06-02 08:08:38
【问题描述】:

背景资料: 我们的应用程序使用由外部供应商编写的组件。该组件有时会因 C++ 运行时错误“调用纯虚函数”对话框而崩溃。我们将应用程序部署在 LCD 显示器上,我们希望崩溃只是简单地崩溃,因为我们有一个流程可以在应用程序崩溃时重新启动它。

我们确定问题的根源在于供应商提供的组件,我们无法修改该组件,因为我们没有源头。如果我们能够在崩溃时自动重启应用程序,我们可以等待供应商提供的解决方案。问题是在用户单击错误的确定按钮之前应用程序不会崩溃,因此我们无法检测到进程停止运行。

我构建了一个小型测试应用程序,一个普通的 Win32 GUI 应用程序,我添加了以下代码:

class A
{
    public:
        A();

    protected:
        virtual void  myTest() = 0;

        void zubzub();
};

class B : public A
{
    protected:
        virtual void  myTest();
};

A::A()
{
    zubzub();
}

void B::myTest()
{
}

void A::zubzub()
{
    this->myTest();
}

然后我在 VS 生成的 win32 应用程序模板中弹出窗口后创建了一个 A 的实例,瞧!我有模态对话框。我尝试了here的解决方案,但它仍然显示错误对话框。

关于如何抑制该对话框并静默崩溃的任何线索

【问题讨论】:

  • 更好的方法是在构造完成之前或销毁开始之后不调用纯虚函数...
  • 您唯一真正的解决方案是解决真正的问题。不要把头埋在沙子里。
  • 让供应商修复他们的代码
  • @DavidHeffernan 你不认为如果这可能的话,提问者不可能自己想出这个吗?即使他们修复了这个错误,他们还没有发现的那个呢?
  • @VincentHubert:执行纯虚拟调用的代码损坏,您需要让该组件的所有者修复它。如果您有资源自己修复它,如果您没有让供应商修复它。另一个问题是,如果您正在销毁对象然后尝试使用它(这将是您的代码中的错误,需要再次修复)

标签: c++ winapi


【解决方案1】:

也许与其直接检测崩溃,不如检测到你的应用前面有一个对话框,然后自己结束应用。只要消息泵是可操作的(它会在显示消息框时),您就可以使用GetActiveWindow 进行计时器回调并验证返回的窗口句柄是您的一个。

【讨论】:

  • 有趣的解决方案... 鉴于我们的应用程序是用 .Net 编写的,并且它自己弹出窗口,我们需要在每次弹出窗口时向计时器注册窗口句柄。而且我认为 OCX 组件会弹出自己的窗口。希望我能得到比这更简单的东西
【解决方案2】:

在您的主应用程序中使用_set_purecall_handler 函数。它会影响您的应用程序(直接或间接)加载的所有 dll。 MSDN 说它应该可以通过 P/Invoke 调用;这个question 解决了一些可能的问题。 (基本上,问题是您必须为特定的 CRT 版本执行此操作。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-31
    • 2010-09-11
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多