求救!!!关于MFC中的BSTR参数如何调用问题,在线等 本帖最后由 vicagogo 于 2012-11-23 11:10:19 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 in_pBstr=NULL;在做无用功,对外面没有影响后面一个AfxMessageBox()读的是垃圾内存,还有AfxMessageBox()好像不能接收BSTR参数. 那我该如何在这个函数里面写BSTR的内存释放呢,我在测试类写了TCHAR sz[100];BSTR bstr = SysAllocString(sz);之后AfxMessageBox();传那个输出都是一样的,问题是,我好像那个函数没有对 我有好几个函数都是要输入BSTR类型的参数:例如:BSTR getBstr();调用的时候就可以返回正常值。BOOL GetBstr(BSTR out_Bstr);调用的时候该如何获得out_Bstr吗?为什么我调用的时候返回的是空值呢 总之就是一个问题:当BSTR为输入输出参数时,如何调用来保证指向的是同一块内存呢?我出问题,貌似是内存指向地址不一样。为什么我LPCTSTR类型就没有此问题。 本帖最后由 happyparrot 于 2012-11-23 11:36:17 编辑 BSTR是一个很奇怪的指针类型,其头部其实在pBstr-2的位置,规定了长度,pBstr实际指向的是数据部分.if(SUCCEEDED(freeBSTR(BSTR pBstr))){pBstr=NULL;}或者用_bstr_t strX(pBstr,false);这种包装类. happyparrot文档上就用了BSTR不是BSTR*,所以我也不能改啊 大家看一下这个吧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类型参数的问题。谢谢 str是临时变量啊,出了函数就释放了 但是out_pScannerModelName指针不是存储了内容了吗 一般资源型参数规范[in]参数用BSTR,[out]参数用BSTR*,[in,out]参数用BSTR*[out]参数caller应该保证传入时,该值为空,并且caller负责释放该参数资源[in]参数callee如果要保留应该复制一份,caller负责资源释放[in,out]参数被覆盖时,callee应做到原先资源的释放[in,out]caller保证回传资源的释放 一样的问题,不能当返回值用。想让函数分配一个空间,得用BSTR*作为参数,不能是BSTR。 如何用VC生成一个快捷方式文件? 这个怎么办?文件目录的问题... 添加数据的问题。。。。。。。。。。。(请教) 在VC中怎么加析构函数 ***请问如何用纯SDK的方法列举出任务栏上的窗口*** 擴展名為wdl的文件用什么软件可以打开? 求助 高手们!帮忙看一下这段源程序! 大家都说“西祠的高手“什么的,到底是哪个网站啊? 用DAO数据库怎样实现ACCESS兼容? 在对话框中不能正确显示当前光标值 给C#调用的MFC dll的编写
TCHAR sz[100];
BSTR bstr = SysAllocString(sz);
之后AfxMessageBox();传那个输出都是一样的,
问题是,我好像那个函数没有对
例如:
BSTR getBstr();
调用的时候就可以返回正常值。
BOOL GetBstr(BSTR out_Bstr);
调用的时候该如何获得out_Bstr吗?为什么我调用的时候返回的是空值呢
当BSTR为输入输出参数时,如何调用来保证指向的是同一块内存呢?我出问题,貌似是内存指向地址不一样。为什么我LPCTSTR类型就没有此问题。
if(SUCCEEDED(freeBSTR(BSTR pBstr))){pBstr=NULL;}
或者用_bstr_t strX(pBstr,false);这种包装类.
文档上就用了BSTR不是BSTR*,所以我也不能改啊
{
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类型参数的问题。谢谢
但是out_pScannerModelName指针不是存储了内容了吗
一般资源型参数规范[in]参数用BSTR,[out]参数用BSTR*,[in,out]参数用BSTR*
[out]参数caller应该保证传入时,该值为空,并且caller负责释放该参数资源
[in]参数callee如果要保留应该复制一份,caller负责资源释放
[in,out]参数被覆盖时,callee应做到原先资源的释放
[in,out]caller保证回传资源的释放