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是没有问题的,怎么回事?
{
[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是没有问题的,怎么回事?
med2我也要作为接口方法的,写一个和med2功能相同的内部函数应该也可以吧?
线程模型这一块怎么这么烦
如 [id(11),helpstring("get response message method")] HRESULT getResponseMessage([out,retval]ICommandMessage** pRet);
class CAgent
{
public :
HRESULT getResponseMessage(ICommandMessage** pRet) private :
ICommandMessage* m_pCmd;
} HRESULT CAgent::getResponseMessage(ICommandMessage** pRet)
{
*pRet=m_pCmd;//不行的啊
return S_OK;
}
这不是线程模式的问题,因为内部调用是不通过proxy/stub的。
楼主的程序结构没错,可能是其它地方的问题。2.
CCommandMessaged是COM对象吗?如果不是COM对象,不可以通过COM的Interface传递。
哎,用VB写很简单的东西,想用VC写一版怎么就这么难呢
1. CAgent不是COM对象
2. m_pCmd没有创建对象也许是你特意省略了这部份代码。但单从你提供的代码上看,是没有问题的。
因为,这是很通用的传递方式。有两个方法创建m_pCmd对象:
1. 使用CoCreateInstance创建
2. 使用ATL类的创建方法(仅限于ATL)==> CComObject<CCommandMessaged>::CreateInstance(...)
{
public :
HRESULT getResponseMessage(IDispatch** pRet) private :
ICommandMessage* m_pCmd;
} HRESULT CAgent::getResponseMessage(IDispatch** pRet)
{
m_pCmd->QueryInterface(...pRet)
return S_OK;
}