求救!!!关于MFC中的BSTR参数如何调用问题,在线等

vicagogo 2012-11-23 11:06:10
在dll中定义了一下函数:
HRESULT WINAPI EXPORT freeBSTR(BSTR pBstr)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if(pBstr!=NULL)
{
::SysFreeString(pBstr);
pBstr=NULL;
}
return S_OK;
}

在测试时候我调用
BSTR bstr = getDriverName(1);
AfxMessageBox(bstr);//输出 为“aaaaaaa”
freeBSTR(bstr);
AfxMessageBox(bstr);//输出还是“aaaaaaa”
请问为什么,我测试类中调用的不对吗,为什么没有释放。
...全文
232 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐鹦鹉 2012-11-23
  • 打赏
  • 举报
回复
一样的问题,不能当返回值用。想让函数分配一个空间,得用BSTR*作为参数,不能是BSTR。
I_ask_who 2012-11-23
  • 打赏
  • 举报
回复
一般资源型参数规范 [in]参数用BSTR,[out]参数用BSTR*,[in,out]参数用BSTR* [out]参数caller应该保证传入时,该值为空,并且caller负责释放该参数资源 [in]参数callee如果要保留应该复制一份,caller负责资源释放 [in,out]参数被覆盖时,callee应做到原先资源的释放 [in,out]caller保证回传资源的释放
vicagogo 2012-11-23
  • 打赏
  • 举报
回复
引用 10 楼 happyparrot 的回复:
str是临时变量啊,出了函数就释放了
但是out_pScannerModelName指针不是存储了内容了吗
快乐鹦鹉 2012-11-23
  • 打赏
  • 举报
回复
str是临时变量啊,出了函数就释放了
vicagogo 2012-11-23
  • 打赏
  • 举报
回复
大家看一下这个吧

HRESULT WINAPI EXPORT getDriverName(INT in_nIndex, BSTR out_pScannerModelName)
{ 
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	CString str = gManager.GetModelName(in_nIndex);
	out_pScannerModelName = str.AllocSysString();
	if(out_pScannerModelName!=NULL)
	{
		return S_OK;
	}
	else
		return S_FALSE;
}
调用的时候


TCHAR szModelName[100];
BSTR bstr = ::SysAllocString(szModelName);
::getDriverName(1,bstr);
AfxMessageBox(bstr);
我加断点测试,为什么在dll函数体内out_pScannerModelName为“ML300” 而我想存储在的szModelName却为空,大家给我看一下吧,其实这个跟那个freeBSTR()是一样的,都是操作BSTR类型参数的问题。谢谢
vicagogo 2012-11-23
  • 打赏
  • 举报
回复
我把代码全粘上,你们帮我看一下吧
vicagogo 2012-11-23
  • 打赏
  • 举报
回复
happyparrot 文档上就用了BSTR不是BSTR*,所以我也不能改啊
I_ask_who 2012-11-23
  • 打赏
  • 举报
回复
BSTR是一个很奇怪的指针类型,其头部其实在pBstr-2的位置,规定了长度,pBstr实际指向的是数据部分. if(SUCCEEDED(freeBSTR(BSTR pBstr))){pBstr=NULL;} 或者用_bstr_t strX(pBstr,false);这种包装类.
快乐鹦鹉 2012-11-23
  • 打赏
  • 举报
回复
HRESULT WINAPI EXPORT freeBSTR(BSTR *pBstr)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if(pBstr!=NULL)
{
::SysFreeString(*pBstr);
*pBstr=NULL;
}
return S_OK;
}
vicagogo 2012-11-23
  • 打赏
  • 举报
回复
总之就是一个问题: 当BSTR为输入输出参数时,如何调用来保证指向的是同一块内存呢?我出问题,貌似是内存指向地址不一样。为什么我LPCTSTR类型就没有此问题。
vicagogo 2012-11-23
  • 打赏
  • 举报
回复
我有好几个函数都是要输入BSTR类型的参数: 例如: BSTR getBstr(); 调用的时候就可以返回正常值。 BOOL GetBstr(BSTR out_Bstr); 调用的时候该如何获得out_Bstr吗?为什么我调用的时候返回的是空值呢
vicagogo 2012-11-23
  • 打赏
  • 举报
回复
那我该如何在这个函数里面写BSTR的内存释放呢,我在测试类写了 TCHAR sz[100]; BSTR bstr = SysAllocString(sz); 之后AfxMessageBox();传那个输出都是一样的, 问题是,我好像那个函数没有对
I_ask_who 2012-11-23
  • 打赏
  • 举报
回复
in_pBstr=NULL;在做无用功,对外面没有影响 后面一个AfxMessageBox()读的是垃圾内存,还有AfxMessageBox()好像不能接收BSTR参数.

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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