接口内部函数怎么不能相互调用?在线等

weiym 2005-08-03 11:25:47
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是没有问题的,怎么回事?
...全文
181 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
吹泡泡的小猫 2005-08-04
  • 打赏
  • 举报
回复
接口函数这样设计

class CAgent
{
public :
HRESULT getResponseMessage(IDispatch** pRet)

private :
ICommandMessage* m_pCmd;
}

HRESULT CAgent::getResponseMessage(IDispatch** pRet)
{
m_pCmd->QueryInterface(...pRet)
return S_OK;
}
weiym 2005-08-04
  • 打赏
  • 举报
回复
up
weiym 2005-08-04
  • 打赏
  • 举报
回复
up
weiym 2005-08-04
  • 打赏
  • 举报
回复
楼上的,CAgent是一个COM对象,它内部有一个ICommandMessage* m_pCmd的接口指针,它们是在同一个工程里面的,我通过CoCreateInstance创建了ICommandMessage接口,现在要在CAgent类里提供一个方法 HRESULT getResponseMessage(ICommandMessage** pRet) 返回成员接口对象m_pCmd,具体该怎么实现,好象要在CCommandMessage里重载=符号的.
nelsonc 2005-08-04
  • 打赏
  • 举报
回复
从接口传出Interface指针,从你的代码上看有两个问题:
1. CAgent不是COM对象
2. m_pCmd没有创建对象

也许是你特意省略了这部份代码。但单从你提供的代码上看,是没有问题的。
因为,这是很通用的传递方式。

有两个方法创建m_pCmd对象:
1. 使用CoCreateInstance创建
2. 使用ATL类的创建方法(仅限于ATL)==> CComObject<CCommandMessaged>::CreateInstance(...)
weiym 2005-08-04
  • 打赏
  • 举报
回复
up
weiym 2005-08-04
  • 打赏
  • 举报
回复
好的,谢谢楼上,解决了我就给分
weiym 2005-08-03
  • 打赏
  • 举报
回复
不可能没遇到过的啊,分不够我可以再加啊,真郁闷
weiym 2005-08-03
  • 打赏
  • 举报
回复
怎么没人回答啊,感觉这是很基本的问题啊
iceqings 2005-08-03
  • 打赏
  • 举报
回复
欢迎加入Visual C++ 开发 QQ群

群号:9643456

有不能解决的问题吗,加入我们,让我们共同解决
iceqings 2005-08-03
  • 打赏
  • 举报
回复
欢迎加入Visual C++ 开发 QQ群

群号:9643456

有不能解决的问题吗,加入我们,让我们共同解决
weiym 2005-08-03
  • 打赏
  • 举报
回复
第一个问题如 orbit(走了走了) 所说已经解决了,还有第二个问题不知道怎么办?
AntonlioX 2005-08-03
  • 打赏
  • 举报
回复
up
weiym 2005-08-03
  • 打赏
  • 举报
回复
自己up
weiym 2005-08-03
  • 打赏
  • 举报
回复
楼上的,CCommandMessage是COM对象
哎,用VB写很简单的东西,想用VC写一版怎么就这么难呢
nelsonc 2005-08-03
  • 打赏
  • 举报
回复
1.
这不是线程模式的问题,因为内部调用是不通过proxy/stub的。
楼主的程序结构没错,可能是其它地方的问题。

2.
CCommandMessaged是COM对象吗?如果不是COM对象,不可以通过COM的Interface传递。
weiym 2005-08-03
  • 打赏
  • 举报
回复

class CAgent
{
public :
HRESULT getResponseMessage(ICommandMessage** pRet)

private :
ICommandMessage* m_pCmd;
}

HRESULT CAgent::getResponseMessage(ICommandMessage** pRet)
{
*pRet=m_pCmd;//不行的啊
return S_OK;
}
weiym 2005-08-03
  • 打赏
  • 举报
回复
我是楼主,再问一下,我有个接口函数如果要返回CCommandMessaged对象,该怎么实现?
如 [id(11),helpstring("get response message method")] HRESULT getResponseMessage([out,retval]ICommandMessage** pRet);
吹泡泡的小猫 2005-08-03
  • 打赏
  • 举报
回复
写一个内部函数,med2也可以借助这个函数实现
weiym 2005-08-03
  • 打赏
  • 举报
回复
好,谢谢楼上的
med2我也要作为接口方法的,写一个和med2功能相同的内部函数应该也可以吧?
线程模型这一块怎么这么烦
加载更多回复(3)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧