Interface:
GetParm(BSTR* pBstrParm)
{
*pBstrParm = ::SysAllocString("parm");
}该接口在DCOM中被调用,在客户端该怎样释放DCOM中分配的内存?::SysFreeString()在客户端掉用有效吗?初写这些东西,大家赐教哦!
GetParm(BSTR* pBstrParm)
{
*pBstrParm = ::SysAllocString("parm");
}该接口在DCOM中被调用,在客户端该怎样释放DCOM中分配的内存?::SysFreeString()在客户端掉用有效吗?初写这些东西,大家赐教哦!
1.[in]类型的参数资源,调用者分配,调用者释放
2.[out]类型的,被调用者(服务器)分配,调用者释放
3.[in,out]类型的,调用者分配,调用者释放,但是中间被调用者可以重新分配其资源,即新释放旧资源再分配新的资源*pBstrParm = ::SysAllocString("parm");
应该为:
*pBstrParm = ::SysAllocString(L"parm");
如果上面你的函数在idl中声明参数为[out],那就没错了
1)
BSTR tmp = NULL;
try
{
InterfacePtr->GetPara(&tmp);
...//处理
}
catch (...)
{
::SysFreeString(tmp);
}2)
{
BSTR tmp;
InterfacePtr->GetPara(&tmp);
_bstr_t Para(tmp, false);
...//处理
} //自动由Para释放掉偶一般都采用第二种。
我担心就是这个了我的IDL文件需要定义一个结构体,用来在接口函数中传入和传出参数。该结构体有很多char[n]类型的字段,没办法确定char数组的长度。我在寻找一种数据类型,就像MFC中的CString,或std::string。我现在尝试使用BSTR,由于它是基本类型,它还有长度信息,故在接口函数中传入和传出时很方便。但由于它是一指针类型,在服务器端分配内存,我不能像CoTaskMemFree()一样进行释放。有该方面经验的朋友赐教了