接口和类如下:  interface IF_Dispatch
{
    virtual VARIANT Invoke(...) = 0;
} interface IF_Test : public IF_Dispatch
{
    virtual void func1() = 0;
    virtual void func2() = 0;
}template<class _IF>
class CDispatch : public _IF
{
    virtual VARIANT Invoke(...);
    virtual void func1();
    virtual void func2();
}class CTest : public CDispatch<IF_Test>
{
    virtual void func1();
    virtual void func2();  
}声明:并非com!
我想在模板类CDispatch 中实现Invoke,即程序分发,初步设想:
  取得函数名,根据函数名得到函数指针,然后执行函数。这成为整个构想的瓶颈。其他难点不用考虑。各位帮帮忙告诉我怎样有派生类取得基类的虚函数指针,(一种方法当然是访问虚函数表)这在c中似乎无法实现,既无法由派生类虚函数表访问基类虚函数表。555~~~,好像非用汇编硬炸不可了,无奈小弟汇编不到家,正在研究中,也希望各位大侠挺身而出,指点一下,有代码提示最好。    我的汇编思路:把虚函指针压栈,进汇编后弹出使用??但在哪压阿??
烦恼ing.

解决方案 »

  1.   

    新的思路:我汇编烂烂!更何况内联汇编和外部汇编有不少区别,所以请精通内联汇编的同志帮帮忙啦!!!下面代码只是思路,不成功的:(__asm
    {
        push FunParam ;先将函数参数压栈

      push si ;将this指针压栈,以确保在当前类上操作

      mov bx,word ptr[si] ;因为VC++编译器将VPTR放在类的第一个位置上,所以bx内为VPTR   call word ptr[bx+n] ;调用虚拟函数。n = 所调用的虚拟函数在对应 VTABLE 中的位置 

    }
      

  2.   

    再call调用函数后,将栈指针付给ebp,ebp+4就是函数的地址。
      

  3.   

    call word ptr[bx+n]就是调用虚函数指针,但不知为什么mov bx,word ptr[si]通不过!!意思似乎是说word ptr有问题,faint! si寄存器分明16位,ptr分明也可以用作内联汇编!!!!有作过内联汇编的帮帮忙啦:(
      

  4.   

    你用 32BIT 汇编做比较好
    在调用之前也可以 MOV ECX,word ptr[Ebx+n]
      

  5.   

    TO:starnight2008(飞羽)
    你这个东西应该是在 WIN 界面下用的,使用的当然是 32位系统,指针也自然用 32bit 的。
    可在你的代码里面使用的是 16bit 指针。
    你该用内联 32 位汇编做,该不会有问题。
      

  6.   

    这个问题发贴后不到三天就做出来了,本以为这个问题没人理了,所以一直没来看。今天来看后面有这么多人回答。用32位汇编就行了,而且我把当前类的存储位置搞错了,应该是ecx而非堆栈。我要做的是通过基类调用未知的派生类,所以只能用汇编。关键代码(有点删节):

    __asm
    {
    pushad
    } __asm
    {
    push nParam
    }
    __asm
    {
    push sParam
    }
    __asm
    {
    mov eax, DWORD PTR pObject;
    mov edx, DWORD PTR [eax]
    mov ecx, DWORD PTR pObject
    mov ebx, nIndex
    call DWORD PTR [edx+ebx]
    }

    __asm
    {
    mov nRetVal, eax
    } __asm
    {
    popad
    }十一啦,散分啦!!!