Как получить индекс virtual func в vftbl на этапе компиляции
От: Andrew_D  
Дата: 23.10.06 16:48
Оценка:
Дано:
interface ISome
{
   virtual void f1()=0;
   virtual void f2()=0;
   virtual void f3()=0;
   virtual void operator()()=0;
};

// нужно получить что-то подобное
// либо в виде енума:
enum E_ISomeOffsets
{
   eOff_f1 = 0x0, // индекс для f1()
   eOff_f1 = 0x2, // индекс для f3()
   eOff_operator_braked = 0x3, // индекс для operator()()
};

// либо в виде макроса:
#define __OFF_ISome_f1__ 0x0
#define __OFF_ISome_f3__ 0x2
#define __OFF_ISome_operator_braked__ 0x3

Т.е. задача сводится к вычислению на/перед этапе/этапом компиляции смещений для виртуальных функций —
нужно по заданным интерфейсам сгенерировать величины смещения для указанных методов.
Перегруженных методов нет, наследование пока не рассматриваем.

У кого какие мысли? Поделитесь пожалуйста
Re: Как получить индекс virtual func в vftbl на этапе компил
От: MShura  
Дата: 23.10.06 20:12
Оценка:
A_D>Т.е. задача сводится к вычислению на/перед этапе/этапом компиляции смещений для виртуальных функций -
A_D>нужно по заданным интерфейсам сгенерировать величины смещения для указанных методов.
A_D>Перегруженных методов нет, наследование пока не рассматриваем.

A_D>У кого какие мысли? Поделитесь пожалуйста


Если бы не operator(), то решение задачи на языке C


typedef struct ISomeVtbl
{
   void (__stdcall *f1)();
   void (__stdcall *f2)();
   void (__stdcall *f3)();
} ISomeVtbl;

interface ISome
{
    const struct ISomeVtbl* Vtbl;
};

C_ASSERT( sizeof(((ISomeVtbl*)NULL)->f1) == sizeof(((ISomeVtbl*)NULL)->f2) );
C_ASSERT( sizeof(((ISomeVtbl*)NULL)->f1) == sizeof(((ISomeVtbl*)NULL)->f3) );

#define __OFF_ISome_f1__    (FIELD_OFFSET(ISomeVtbl, f1)/sizeof(((ISomeVtbl*)NULL)->f1))
#define __OFF_ISome_f2__    (FIELD_OFFSET(ISomeVtbl, f2)/sizeof(((ISomeVtbl*)NULL)->f1))
#define __OFF_ISome_f3__    (FIELD_OFFSET(ISomeVtbl, f3)/sizeof(((ISomeVtbl*)NULL)->f1))


Если интерфейс ISome был описан в idl файле (вряд ли из-за operator()), то описание интерфейса на C и описание на языке С++ находятся в одном файле.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.