如何将 ATL com class 对象作为参数传递给 COM
How to pass ATL com class object as paramater to COM
和this thread一样,但是当我向方法中传递一个字符串时,com class中的字符串是错误的,代码如下:
com 服务器 - Com.idl:
interface IParamClass : IUnknown
{
[] HRESULT SetString([in] BSTR str);
}
interface IMyClass : IUnknown
{
[] HRESULT PassComClassAsParam([in] IParamClass* parm);
}
ParamClass.cpp
class ATL_NO_VTABLE CParamClass : ...
{
...
public:
BSTR m_str;
STDMETHOD(SetString)(BSTR str);
};
STDMETHODIMP CParamClass::SetString(BSTR str)
{
m_str = str;
return S_OK;
}
MyClass.cpp:
STDMETHODIMP CMyClass::PassComClassAsParam( IParamClass* param)
{
CParamClass *obj = (CParamClass*)param;
BSTR str = obj->m_str; //debugging here, is wrong string
...
}
C# 客户端:
MyClass myobj = new MyClass();
ParamClass param = new ParamClass();
param.SetString("Test String!");
myobj.PassComClassAsParam(param);
您必须在此处复制字符串参数,因为您无法控制值的生命周期:
STDMETHODIMP CParamClass::SetString(BSTR str)
{
m_str = str; // str is valid here, but you don't know when
// the value is destroyed later
return S_OK;
}
当您通过 m_str
变量使用该值时,该字符串已经被释放并销毁,因此您会看到它 "wrong".
典型的解决方案是:
class ATL_NO_VTABLE CParamClass : ...
{
...
public:
CComBSTR m_str; // <<--- Note CComBSTR
STDMETHOD(SetString)(BSTR str);
};
STDMETHODIMP CParamClass::SetString(BSTR str)
{
m_str = str;
return S_OK;
}
和this thread一样,但是当我向方法中传递一个字符串时,com class中的字符串是错误的,代码如下:
com 服务器 - Com.idl:
interface IParamClass : IUnknown
{
[] HRESULT SetString([in] BSTR str);
}
interface IMyClass : IUnknown
{
[] HRESULT PassComClassAsParam([in] IParamClass* parm);
}
ParamClass.cpp
class ATL_NO_VTABLE CParamClass : ...
{
...
public:
BSTR m_str;
STDMETHOD(SetString)(BSTR str);
};
STDMETHODIMP CParamClass::SetString(BSTR str)
{
m_str = str;
return S_OK;
}
MyClass.cpp:
STDMETHODIMP CMyClass::PassComClassAsParam( IParamClass* param)
{
CParamClass *obj = (CParamClass*)param;
BSTR str = obj->m_str; //debugging here, is wrong string
...
}
C# 客户端:
MyClass myobj = new MyClass();
ParamClass param = new ParamClass();
param.SetString("Test String!");
myobj.PassComClassAsParam(param);
您必须在此处复制字符串参数,因为您无法控制值的生命周期:
STDMETHODIMP CParamClass::SetString(BSTR str)
{
m_str = str; // str is valid here, but you don't know when
// the value is destroyed later
return S_OK;
}
当您通过 m_str
变量使用该值时,该字符串已经被释放并销毁,因此您会看到它 "wrong".
典型的解决方案是:
class ATL_NO_VTABLE CParamClass : ...
{
...
public:
CComBSTR m_str; // <<--- Note CComBSTR
STDMETHOD(SetString)(BSTR str);
};
STDMETHODIMP CParamClass::SetString(BSTR str)
{
m_str = str;
return S_OK;
}