В предыдущей серии мы создавали объекты с использованием обертки, написанной на Delphi, включенной в проект C++ Builder. В этот раз сделаем еще лучше - напишем параметризованный вызов конструктора объекта Delphi на С++, используя Delphi RTTI.

namespace EsUtilities
{
/// Create Delphi object instance from its metaclass
typedef std::vector<TValue> EsArgsT;
EKOSF_COREGUI_FUNC TObject* NEW(TMetaClass* mc, const EsArgsT& args);
}

TObject* EsUtilities::NEW(TMetaClass* mc, const EsUtilities::EsArgsT& args)
{
  ES_ASSERT(mc);
  TRttiContext ctx;
  TRttiType* type = ctx.GetType(mc);
  if(type)
  {
    DynamicArray<TRttiMethod*> ctrs = type->GetMethods("Create");
    for( int idx = 0; idx < ctrs.Length; ++idx )
    {
      TRttiMethod* ctr = ctrs[idx];
      if( ctr->IsConstructor )
      {
        DynamicArray<TRttiParameter*> params = ctr->GetParameters();
        if( (DynArrInt)args.size() == params.Length )
        {
          int acnt = (int)args.size();
          const TValue* pargs = 0;
          if( !args.empty() )
            pargs = &args[0];

          return ctr->Invoke(mc, pargs, acnt-1).AsObject();
        }
      }
    }
  }

  return 0;
}