【转】遇到 External Exception EEFFACE 错误的解决办法

1、安装一个补丁包后重新编译源程序。参见:http://www.respower.com/~earlye/programming/TranslateStandardExceptions.htm

压缩包下载地址:https://files.cnblogs.com/zhujiecode/TranslateStandardExceptions.zip

2、修改注册表:

假设出错的应用程序名为“Project1.exe”,打开注册表,找到如下主键:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options]
新建一个“Project1.exe”项,然后再其下创建一个字符串值,键值名为“DisableHeapLookAside”,内容设为“1”即可(有时候留空也有效)。


上面两种方法只试过了第一种,程序脱离IDE运行没有再出现这个错误。但偶尔在IDE中运行还是会弹出这个错误(例如ShellExecute函数经常会弹出这个错误)。

对于“External Exception EEFFACE”这个错误产生的原因在于---bcb采用的vcl库是由pascal语言写的,当C++代码产生的异常对象不是vcl提供的Exception类的子类对象时,就会报出这个错误。可以新建工程将下面代码测试一遍就会发现这个问题。

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

class MyException1
{
public:
        MyException1(AnsiString msg){Message=msg;}
public:
        AnsiString Message;
};

class MyException2:public Exception
{
public:
        MyException2(AnsiString msg):Exception(msg){Message=msg;}
public:
        AnsiString Message;
};

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
      throw MyException1("test1");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
     throw MyException2("test2");
}
//---------------------------------------------------------------------------

 

posted @ 2012-08-02 17:59  小二来壶酒  阅读(15041)  评论(0)    收藏  举报