В качестве бреда...поправил Blang.dll
Появилась возможность выполнять подобный "код":
Передаем в сом-объект 1C-ю Форму
Перем Wrap;
Перем МД;
Процедура Подготовить(buf, ECX, Addr) // для соглашения вызова thiscall, в ecx - указатель на объект
Wrap.NumPut(МД.СтрокаВЧисло("B9", 16), buf, 0, "b"); // mov ecx, ....
Wrap.NumPut(ECX, buf, 1); // *CBLContext
Wrap.NumPut(МД.СтрокаВЧисло("E9", 16), buf, 5, "b"); // jmp ...Addr
Wrap.NumPut(Addr - (buf + 6 + 4), buf, 6);
КонецПроцедуры
Процедура Сформировать()
buf = Wrap.GlobalAlloc(64, 256);
// Передаем объект "Форма"
pCValue = Wrap.NumGet(Форма);
pCBLContext = Wrap.NumGet(pCValue + МД.СтрокаВЧисло("48", 16)); // +48h
vtable = Wrap.NumGet(pCBLContext);
If pCBLContext <> 0 Then
//CBLContext::GetNMethods
vfunс = Wrap.NumGet(vtable + МД.СтрокаВЧисло("64", 16));
Подготовить(buf, pCBLContext, vfunс);
Wrap.RegisterAddr(buf, "GetNMethods", "f=s", "r=l");
NMethods = Wrap.GetNMethods();
//CBLContext::GetMethodName
vfunс = Wrap.NumGet(vtable + МД.СтрокаВЧисло("6C", 16));
Подготовить(buf, pCBLContext, vfunс);
Wrap.RegisterAddr(buf, "GetMethodName", "i=ll", "r=s");
For j = 0 To NMethods -1 Do
MethodName = Wrap.StrGet(Wrap.GetMethodName(j, 1));
Message(MethodName);
EndDo;
EndIf;
Wrap.GlobalFree(buf);
КонецПроцедуры
Wrap = СоздатьОбъект("DynamicWrapperX");
Wrap.Register("Kernel32", "GlobalAlloc" , "i=ll", "r=u");
Wrap.Register("Kernel32", "GlobalFree" , "i=h", "r=l");
МД = СоздатьОбъект("MetaDataWork");
Печатает методы объекта Форма