本帖最后由 vicagogo 于 2012-11-23 11:10:19 编辑

解决方案 »

  1.   

    in_pBstr=NULL;在做无用功,对外面没有影响后面一个AfxMessageBox()读的是垃圾内存,还有AfxMessageBox()好像不能接收BSTR参数.
      

  2.   

    那我该如何在这个函数里面写BSTR的内存释放呢,我在测试类写了
    TCHAR sz[100];
    BSTR bstr = SysAllocString(sz);
    之后AfxMessageBox();传那个输出都是一样的,
    问题是,我好像那个函数没有对
      

  3.   

    我有好几个函数都是要输入BSTR类型的参数:
    例如:
    BSTR getBstr();
    调用的时候就可以返回正常值。
    BOOL GetBstr(BSTR out_Bstr);
    调用的时候该如何获得out_Bstr吗?为什么我调用的时候返回的是空值呢
      

  4.   

    总之就是一个问题:
    当BSTR为输入输出参数时,如何调用来保证指向的是同一块内存呢?我出问题,貌似是内存指向地址不一样。为什么我LPCTSTR类型就没有此问题。
      

  5.   

    本帖最后由 happyparrot 于 2012-11-23 11:36:17 编辑
      

  6.   

    BSTR是一个很奇怪的指针类型,其头部其实在pBstr-2的位置,规定了长度,pBstr实际指向的是数据部分.
    if(SUCCEEDED(freeBSTR(BSTR pBstr))){pBstr=NULL;}
    或者用_bstr_t strX(pBstr,false);这种包装类.
      

  7.   

    happyparrot
    文档上就用了BSTR不是BSTR*,所以我也不能改啊
      

  8.   

    大家看一下这个吧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类型参数的问题。谢谢
      

  9.   

    str是临时变量啊,出了函数就释放了
      

  10.   


    但是out_pScannerModelName指针不是存储了内容了吗
      

  11.   


    一般资源型参数规范[in]参数用BSTR,[out]参数用BSTR*,[in,out]参数用BSTR*
    [out]参数caller应该保证传入时,该值为空,并且caller负责释放该参数资源
    [in]参数callee如果要保留应该复制一份,caller负责资源释放
    [in,out]参数被覆盖时,callee应做到原先资源的释放
    [in,out]caller保证回传资源的释放
      

  12.   

    一样的问题,不能当返回值用。想让函数分配一个空间,得用BSTR*作为参数,不能是BSTR。