当前位置:Gxlcms > 数据库问题 > 通过PDB文件实现非嵌入式的c++反射

通过PDB文件实现非嵌入式的c++反射

时间:2021-07-01 10:21:17 帮助过:26人阅读

//从PDB文件加载反射信息 refl_mgr.LoadDataFromFile(g_wszPdbFileName);

 

2、对基本数据的get/set

//get instance data member
CReflObject *refl_obj_bar_c;
refl_mgr.GetReflObjectFromParent(refl_obj_bar, L"c", &refl_obj_bar_c);

CReflValue refl_val_bar_c;
refl_mgr.GetClassInstDataMember(&bar, refl_obj_bar_c, &refl_val_bar_c);
printf("%d\n", refl_val_bar_c.m_Data.m_I8);

//set instance data member
CReflObject *refl_obj_bar_i;
refl_mgr.GetReflObjectFromParent(refl_obj_bar, L"i", &refl_obj_bar_i);

CReflValue refl_val_bar_i;
refl_val_bar_i.m_Data.m_I32 = 1024;
refl_mgr.SetClassInstDataMember(&bar, refl_obj_bar_i, &refl_val_bar_i);
printf("%d\n", bar.i);

 

3、调用函数

//函数
CReflObject *refl_obj_func1;
refl_mgr.GetReflObjectFromGlobal(L"TestCallFunc1", &refl_obj_func1);
refl_mgr.PrintReflObject(refl_obj_func1);

std::vector<ffi_obj> vargs;

ffi_obj arg1;
arg1.type = ffi_type_sint32;
arg1.value.i32 = 2014;
vargs.push_back(arg1);

ffi_obj arg2;
arg2.type = ffi_type_pointer;
arg2.value.p = (void*)"hello world";
vargs.push_back(arg2);

ffi_obj ret;
ret.type = ffi_type_void;

refl_mgr.CallReflObject(refl_obj_func1, vargs, ret);

 

当然demo是不完整的,目前我认为还有就几个未解决的比较重要的问题是:

(1)处理对函数的不正确的调用。比如传入了错误的参数、返回值类型指定错了等。这部分cpython的libffi_msvc也没有做好,它做的仅仅是在windows下检测函数调用前后堆栈寄存器的位置是否一致,详见此处。但是仅有这个检测是不够的,它并不能有效的防止崩溃问题。我认为最好能做到能对参数、返回值进行类型检查,如果发现错误能打印错误,并且不进行函数的调用操作。

(2)如何在linux gcc环境下实现。

 

参考资料:

1、Reflection in C++ - a teaser

通过PDB文件实现非嵌入式的c++反射

标签:str   剪裁   加载   ase   工作   pos   获得   \n   定位   

人气教程排行