3

这篇文章是在Remy Lebeau 的帮助下在C++ Builder 期刊论坛上提出的一个问题的继续。我的问题是对 Delphi RTTI 以及如何在 C++ Builder 中使用它缺乏了解。有很多关于如何使用 RTTI 获取类型信息等的文档,但没有太多如何使用它进行发现的文档。

根据我的理解,下面应该设置 RTTI 发现的方法:

class DELPHICLASS MyClass : public MyOtherClass
{
   public:
     //Methods...
   __published:
     //Methods...
}

这是我目前的课程,它覆盖了 Embarcadero iOS API iOSapi.UIKit.hpp 中的 UIAlertViewDelegate 接口中的虚拟方法。

class DELPHICLASS TAlertViewDelegate : public TOCLocal, public UIAlertViewDelegate
{
    typedef Macapi::Objectivec::TOCLocal inherited;
    INTFOBJECT_IMPL_IUNKNOWN(TOCLocal);
    public:
        virtual void __cdecl alertView(_di_UIAlertView alertView, aarch_int_t clickedButtonAtIndex);
        virtual void __cdecl alertViewCancel(_di_UIAlertView alertView);
        virtual void __cdecl didPresentAlertView(_di_UIAlertView alertView);
        virtual void __cdecl alertViewDidDismissWithButtonIndex(_di_UIAlertView alertView, aarch_int_t didDismissWithButtonIndex);
};

但是,当我创建此类的一个实例并使用以下方法在堆上分配它时:

_di_UIAlertViewDelegate Delegate = (UIAlertViewDelegate *)new TAlertViewDelegate();

我收到与 Delphi 相关的 RTTI 错误:

第一次机会例外在 $00158015。异常类 EObjectiveC 带有消息“未找到类型 UIAlertViewDelegate 的 RTTI。也许缺少 {$M+}?'。流程代表 (250202)

将我的类方法从 public 更改为 __published 可以消除此错误,但会导致访问冲突,但查看调用堆栈发生的情况是:

  • 调用 TOCLocal 构造函数
  • TRttiType GetMethods 调用
  • 读取方法数据
  • 读取扩展方法数据
  • 读取对象
  • 读取对象指针
  • 读取对象(再次)
  • 创建 TRTTIInstanceMethodClassic
  • 访问冲突

很明显,RTTI 有问题,因为它在尝试获取方法信息后崩溃了?有经验的人可以在这里提供帮助吗?

4

0 回答 0