В предыдущей серии мы создавали объекты с использованием обертки, написанной на 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;
}