interface ICommandMessage : IDispatch
{
[id(1)] HRESULT med1([in] BSTR sCmdFilePath);
[id(2)] HRESULT med2([in] BSTR sCmdText);
          }
在类中实现时,med1怎么没法调用med2,调试时还没进入函数就访问异常了,请教该怎么实现?STDMETHODIMP CCommandMessage::med2(BSTR s)
{
    return S_OK;
}
STDMETHODIMP CCommandMessage::med1(BSTR s)
{
    return  med2(s);
}
测试发现在构造函数中调用med2是没有问题的,怎么回事?

解决方案 »

  1.   

    进入了,写个客户程序一调用med1就出现异常访问
      

  2.   

    使用的是单线程公寓模式吧?一次只能一个客户进入公寓使用ICommandMessage的方法,嵌套调用相当于进了两次公寓,第二次就会出错。解决的方法是讲公共部分写成CCommandMessage的内部函数,这样就不需要在med1中调用med2了,只需要调用这个内部函数,med2也通过调用这个内部函数实现功能
      

  3.   

    好,谢谢楼上的
     med2我也要作为接口方法的,写一个和med2功能相同的内部函数应该也可以吧?
    线程模型这一块怎么这么烦
      

  4.   

    写一个内部函数,med2也可以借助这个函数实现
      

  5.   

    我是楼主,再问一下,我有个接口函数如果要返回CCommandMessaged对象,该怎么实现?
    如 [id(11),helpstring("get response message method")]  HRESULT getResponseMessage([out,retval]ICommandMessage** pRet);
      

  6.   


    class CAgent
    {
      public :
         HRESULT getResponseMessage(ICommandMessage** pRet)  private :
        ICommandMessage* m_pCmd;
    } HRESULT CAgent::getResponseMessage(ICommandMessage** pRet)
    {
        *pRet=m_pCmd;//不行的啊
       return S_OK;
    }
      

  7.   

    1. 
    这不是线程模式的问题,因为内部调用是不通过proxy/stub的。
    楼主的程序结构没错,可能是其它地方的问题。2.
    CCommandMessaged是COM对象吗?如果不是COM对象,不可以通过COM的Interface传递。
      

  8.   

    楼上的,CCommandMessage是COM对象
    哎,用VB写很简单的东西,想用VC写一版怎么就这么难呢
      

  9.   

    第一个问题如  orbit(走了走了) 所说已经解决了,还有第二个问题不知道怎么办?
      

  10.   

    欢迎加入Visual C++ 开发 QQ群群号:9643456有不能解决的问题吗,加入我们,让我们共同解决
      

  11.   

    欢迎加入Visual C++ 开发 QQ群群号:9643456有不能解决的问题吗,加入我们,让我们共同解决
      

  12.   

    从接口传出Interface指针,从你的代码上看有两个问题:
    1. CAgent不是COM对象
    2. m_pCmd没有创建对象也许是你特意省略了这部份代码。但单从你提供的代码上看,是没有问题的。
    因为,这是很通用的传递方式。有两个方法创建m_pCmd对象:
    1. 使用CoCreateInstance创建
    2. 使用ATL类的创建方法(仅限于ATL)==> CComObject<CCommandMessaged>::CreateInstance(...)
      

  13.   

    楼上的,CAgent是一个COM对象,它内部有一个ICommandMessage* m_pCmd的接口指针,它们是在同一个工程里面的,我通过CoCreateInstance创建了ICommandMessage接口,现在要在CAgent类里提供一个方法 HRESULT  getResponseMessage(ICommandMessage** pRet) 返回成员接口对象m_pCmd,具体该怎么实现,好象要在CCommandMessage里重载=符号的.
      

  14.   

    接口函数这样设计class CAgent
    {
      public :
         HRESULT getResponseMessage(IDispatch** pRet)  private :
        ICommandMessage* m_pCmd;
    } HRESULT CAgent::getResponseMessage(IDispatch** pRet)
    {
       m_pCmd->QueryInterface(...pRet)
      return S_OK;
    }