4528|6

83

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

EVC中的try throw catch [复制链接]

今天我用EVC写了个小程序:
int WINAPI WinMain(        HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPTSTR    lpCmdLine,
                        int       nCmdShow)
{
        // TODO: Place code here.

        try
        {
                throw(90);
        }
        catch(int nERR)
        {
                int j = 0;
        }
       
        return 0;
}

如果用模拟器(Win32 (WCE emulator) Debug)编译,完全正确

换成我自己的SDK编译,出现错误:error LNK2001: unresolved external symbol ___CxxFrameHandler
我PB帮助找了半天,没有这方面的说明,请高手指教。

最新回复

问题解决了: 我原来的PB做出来的SDK没有包含catlog项——“C++ Runtime Support for Exception Handling and Runtime Type Information”,即SYSGEN_CPP_EH_AND_RTTI=1。 看下PB帮助:Platform Builder User's Guide > Compilers for Microprocessors > About Microprocessor Compilers > Exception Handling for Windows CE The following items are important to understand when migrating an OS design that throws C++ exceptions or uses run-time type information: The C++ Runtime Support for Exception Handling and Runtime Type Information Catalog item enables applications to throw exceptions in C++, and to use run-time type information support. You can include this functionality by setting the associated SYSGEN variable, SYSGEN_CPP_EH_AND_RTTI. In past versions, the C++ Runtime Support for Exception Handling and Runtime Type Information Catalog item was separated into two different Catalog items: C++ Exception Handling, associated with a SYSGEN variable called SYSGEN_CPP_SEH Runtime Type Information, associated with a SYSGEN variable called SYSGEN_CPP_RTTI. Both items existed in the C Libraries and Runtimes tree beneath Core OS / Windows CE devices / Applications and Services Development. These SYSGEN variables have been removed from Windows CE 5.0, and replaced by a single new SYSGEN variable, SYSGEN_CPP_EH_AND_RTTI. To include C++ Runtime Support for Exception Handling and Runtime Type Information in a Windows CE 5.0 OS design, set the SYSGEN_CPP_EH_AND_RTTI variable. 结帖,给自己50分!……  详情 回复 发表于 2008-11-7 11:54
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
LZ有没有google一下,可以找到一些相关的信息的
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
<>一书中第十章的“Exception Handling”节如是说:

Windows CE .NET, along with eMbedded C++ 4.0, supports both Microsoft's standard structured exception handling extensions to the C language (the __try, __except and __try, __finally blocks) and the ANSI-standard C++ exception handling framework, with keywords such as catch and throw.

Support for C++ exception handling was added in Windows CE .NET 4.0. The statements, try, catch, and throw are familiar to C++ programmers and work as expected in Windows CE. To use C++ exception handling in a Windows CE C++ application, the application must be compiled with the –GX compiler switch. For those not familiar with the operation of these keywords, what follows is a quick introduction

这个应该是相对权威的说明了!
 
 
 

回复

194

帖子

0

TA的资源

一粒金砂(中级)

4
 
但即使我加了/GX,错误依然。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

5
 
好不容易找到一个非常权威的说法:
http://support.microsoft.com/default.aspx?scid=kb;%5BLN%5D;830482


原文如下:
现已推出 Pocket PC 2003 SDK 的运行时类型信息库

概要
为了向开发人员提供全面的 Microsoft eMbedded Visual C++ 异常处理,以及对 Microsoft Windows Powered Pocket PC 2003 设备的动态转换支持,Microsoft 发布了用于 Pocket PC 2003 SDK 的运行时类型信息 (RTTI) 库。

从 Microsoft 下载中心可以下载以下文件:

立即下载 RITTI.exe 软件包。 (http://download.microsoft.com/download/1/9/4/194f4a97-755f-4e66-b386-48c39f56d379/ritti.exe)

有关如何下载 Microsoft 支持文件的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
119591 (http://support.microsoft.com/kb/119591/) 如何从联机服务获取 Microsoft 支持文件
Microsoft 已对此文件进行了病毒扫描。Microsoft 使用的是该文件发布时可以获得的最新病毒检测软件。该文件存储在安全性得到增强的服务器上,以防止在未经授权的情况下对其进行更改。

RTTI.exe 下载包括用于“ArmV4”和“emulator”内部版本的库文件 (.lib) 和程序数据库文件 (.pdb)。

要在 Pocket PC 2003 项目中使用 RTTI 库,请按照下列步骤操作:1. 将 Ccrtrtti.lib 和 Ccrtrtti.pdb 文件从下载中的 ArmV4 和 Emulator 文件夹复制到 Pocket PC 2003 SDK 的 \Lib 文件夹内名为 ArmV4 和 Emulator 的文件夹中。

注意:默认情况下,这些目录位于安装了 Pocket PC 2003 SDK 的台式计算机上的 C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Lib\ArmV4OrEmulator 文件夹中。
2. 对于您要实现的所有项目配置(包括 eMbedded Visual C++ 4.0 项目设置中的 Ccrtrtti.lib),请按照下列步骤操作:a.  在 eMbedded Visual C++ 4.0 中,单击“项目设置”对话框中的“链接”选项卡。
b.  在“对象/库模块”框中键入 Ccrtrtti.lib。
c.  单击“确定”。

3. 按照下列步骤操作:a.  在“项目设置”对话框中,单击“C/C++”选项卡。
b.  在项目选项列表中添加 /GX 开关。在项目中编译异常处理代码时,需要此开关。

注意:如果项目使用动态转换,则添加 /GR 开关。


更多信息
对数据类型使用“throw”构造、“catch”构造或同时使用两者的 C++ 异常处理代码需要 RTTI 支持来标识异常的类型。没有 RTTI 库,类型化的 C++ 异常处理代码将导致类似于以下错误信息的链接器错误信息:

error LNK2001:unresolved external symbol "const type_info::`vftable'" (??_7type_info@@6B@)
例如,没有 RTTI 库,以下代码将导致前面的链接器错误:try
{
    // The code here can raise exceptions.}
catch(int i)
{
    // Optional exception handling logic goes here.
}
链接器返回此错误,原因是它找不到对 int 类型的异常进行类型标识所需的 RTTI 库。

相同的逻辑应用于涉及任何数据的“throw”构造。 例如,语句throw 1;
需要 RTTI 来确定将处理具有 int 值的异常的匹配“catch”块。

没有 RTTI 库,唯一有效的异常处理构造就是不涉及数据类型的构造。例如,以下代码在没有 RTTI 库的情况下进行链接时不会导致出现错误信息: try
{
    // The code here can raise exceptions.}
catch(...)
{
    // Generic exception handling logic goes here.
}
使用 RTTI 库文件,本文此部分中的所有 C++ 异常处理构造(类型化和非类型化的)都能够生成正确的可执行文件。您无需使用额外的 DLL,因为 Pocket PC 2003 设备和仿真器上的 DLL 中已具有 RTTI 逻辑。

以下是在使用此 RTTI 库时 eMbedded Visual C++ 4.0 Service Pack 2 (SP2) 中遇到的已知问题。 在应用程序 try/catch 块中最后一个逻辑语句后和结束括号前,单步执行通过代码将导致以下事件:? Pocket PC 2003 仿真器上应用程序的可执行文件发生崩溃。
? Pocket PC 2003 设备上的应用程序停止响应(挂起)。
在崩溃时或应用程序停止响应时(在 try/catch 块结尾处),eMbedded Visual C++ IDE 将使用以下错误信息报告一个访问冲突:

First Chance exception
Microsoft 已知道此问题,并准备在将来的版本中修复此问题。

要解决此问题,请在 try/catch 块结尾后的第一个语句中设置断点,然后允许应用程序通过 try/catch 块的结尾,并在断点处继续调试。 到达 try/catch 块中的最后一个逻辑语句之后,请不要单步执行通过代码。

RTTI 库文件还支持动态转换。 例如,没有 RTTI 库,eMbedded Visual C++ 4.0 将对以下代码报告一个链接器错误:struct A

{
   int a;
   A() : a(1) {}
   virtual ~A() {} // All the rest of destructors will be virtual.
};

void Test()

{
   A a;
   A* a4 = dynamic_cast(&a);
}

链接器错误类似于下面的错误信息:

error LNK2001:unresolved external symbol "const type_info::`vftable'" (??_7type_info@@6B@)
error LNK2019:unresolved external symbol ___RTDynamicCast referenced in function "void __cdecl Test(void)" (?Test@@YAXXZ)
如果项目中包含 RTTI 库,动态转换代码将能够成功生成。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
我都不用try的, 在wince下。

呵呵,路过,向lz学习一下。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
问题解决了:

我原来的PB做出来的SDK没有包含catlog项——“C++ Runtime Support for Exception Handling and Runtime Type Information”,即SYSGEN_CPP_EH_AND_RTTI=1。

看下PB帮助:Platform Builder User's Guide > Compilers for Microprocessors > About Microprocessor Compilers > Exception Handling for Windows CE

The following items are important to understand when migrating an OS design that throws C++ exceptions or uses run-time type information:

The C++ Runtime Support for Exception Handling and Runtime Type Information Catalog item enables applications to throw exceptions in C++, and to use run-time type information support. You can include this functionality by setting the associated SYSGEN variable, SYSGEN_CPP_EH_AND_RTTI.

In past versions, the C++ Runtime Support for Exception Handling and Runtime Type Information Catalog item was separated into two different Catalog items:

C++ Exception Handling, associated with a SYSGEN variable called SYSGEN_CPP_SEH
Runtime Type Information, associated with a SYSGEN variable called SYSGEN_CPP_RTTI.
Both items existed in the C Libraries and Runtimes tree beneath Core OS / Windows CE devices / Applications and Services Development.

These SYSGEN variables have been removed from Windows CE 5.0, and replaced by a single new SYSGEN variable, SYSGEN_CPP_EH_AND_RTTI. To include C++ Runtime Support for Exception Handling and Runtime Type Information in a Windows CE 5.0 OS design, set the SYSGEN_CPP_EH_AND_RTTI variable.


结帖,给自己50分!……
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表