使用MFC和早绑定创建了COM对象,我认为访问“COM接口成员函数”必定经过“虚拟表接口”来访问的,我自定义的COM接口IFeifei如下:
import "unknwn.idl";
[
object,
uuid(C177116E-9AAA-11D3-805D-000000000000),
pointer_default(unique)
]
interface IFeifei : IUnknown
{
  HRESULT Method1([in] long lArg1, [out] long *plArg2);
  HRESULT Method2([in] long lArg, [in] unsigned long ulArg);
};Method1和Method1方法只是各实现了简单的对话框,COM组件客户端调用该接口也正常,但是运行时,我发现接口IFeifei的VTBL表中只有IUnknown的那三个函数,却没找到Method1 和 Method2, 为什么???我认为VTBL表中应该有五个函数才对啊,为什么会这样?

解决方案 »

  1.   

    估计你是直接展开 pIFeifei 看的,只看到 IUnknown的那三个函数,是正确的
      

  2.   

    我是这样看IFeifei的VTABLE,如下:IFeifei *iFeifei=NULL;
    HRESULT hr=::CoCreateInstance(CLSID_IWzdSrv,NULL,CLSCTX_INPROC_SERVER,IID_IFeifei,(LPVOID*) &iFeifei);
    if (FAILED(hr))
    {
    _com_error err(hr);
    AfxMessageBox(err.ErrorMessage());
    return;
    }
    long lArg;
    iFeifei->Method1(1234,&lArg); //此处设置断点,查看接口iFeifei指针的VTBL
    long lArg2=12345678L;
    unsigned long ulArg=4026531840L;
    iFeifei->Method2(lArg2, ulArg);
    iFeifei->Release();结果,只看到IUnknown的那三个函数,为什么?为什么看不到Method1和Method2?不是说,直接可以访问制定接口(早绑定)的成员函数?
      

  3.   

    只是你看不到而已,你的程序可看的清楚的很,在你看到的IUnknown那三个函数下面一定就是你的两个函数
      

  4.   

    我发现接口IFeifei的VTBL表中只有IUnknown的那三个函数,却没找到Method1 和 Method2
    >>Method1 和 Method2 不是虚礼的,不应该出现在 virtual table 中。
    //初学com,不能确定回答是否正确。
      

  5.   

    sorry , 说错了,看了看,是 virtual 的。
      

  6.   

    你看到的不是接口IFeifei的VTBL表,而是IUnknown的!
      

  7.   

    To:wangweixing2000iFeifei->Method2(lArg2, ulArg); //不会吧,我看到的是IUnknow的VTBL表?怎样才能看到接口IFeifei的VTBL表?
      

  8.   

    我也很想看到!好像很麻烦!看着个没有必要!肯定这两个方法是在你看到的Vtbl的下面的!有一种办法是你可以得到Method2方法的地址看看是不是和IUnknow的VTBL表有一定关系!
      

  9.   

    To:wangweixing2000如何得到 Method2 方法的地址 ?我的方法如下,但编译通不过。HRESULT(*fucptr)(long,unsigned long);//定义一个函数指针
    fucptr=iWzd->Method2;          //出错,类型无法转换