STDMETHODIMP DataSafe::get_OriginalData(BSTR *pVal)
{
  // TODO: Add your implementation code here
    *pVal=SysAllocString(mOriginalData);
return S_OK;
}//mOriginalData的定义最好用_bst_t,这个东西太好使了

解决方案 »

  1.   

    简的方法就是不用BSTR做属性,BSTR 是个宽字符指指
    如果你使用BSTR我这是简单的,标准的,方法,如果你要让代码只是自已使用可以定义任意的类型,因为你自已会遵守你写的规则,如果你的代码别人可能用到(如VB),那么别人写程序会用标准的方法来写程序,得到的字符串很可能会出错
      

  2.   

    简的方法就是不用BSTR做属性,BSTR 是个宽字符指指
    如果你使用BSTR我这是简单的,标准的,方法,如果你要让代码只是自已使用可以定义任意的类型,因为你自已会遵守你写的规则,如果你的代码别人可能用到(如VB),那么别人写程序会用标准的方法来写程序,得到的字符串很可能会出错
      

  3.   

    STDMETHODIMP DataSafe::get_OriginalData(BSTR *pVal)
    {
      // TODO: Add your implementation code here
        *pVal=_bstr_t(mOriginalData).copy();
    return S_OK;
    }只是最简单的,只有一行,而且不会产生内存泄露
      

  4.   

    或者
    STDMETHODIMP DataSafe::get_OriginalData(BSTR *pVal)
    {
      // TODO: Add your implementation code here
        *pVal=A2WBSTR(mOriginalData);
    return S_OK;
    }
      

  5.   

    to nichang():谢谢
    不过用*pVal=A2WBSTR(mOriginalData);
    还是提示错误:cannot convert parameter 1 from 'unsigned char *' to 'const char *'下面的又改怎么写???mOriginalData=newVal;这句怎么改??STDMETHODIMP DataSafe::put_OriginalData(BSTR newVal)
    {
      // TODO: Add your implementation code here
        mOriginalData=newVal;
    return S_OK;
    }
      

  6.   

    to nichang():
    mOriginalData是内部变量,作为参数传入 别人的DLL里的函数,因为那个函数里参数类型是unsigned char *,所以我把mOriginalData定义成unsigned char *,所以再get,put里出现类型转换的问题。
    BSTR不是字符类型吗,怎么会提示unsigned short *呢??
      

  7.   

    BSTR是宽字符指针,它指向的是OLECHAR*
      

  8.   

    BSTR 是wchar_t*类型,是带有长度前缀的OLECHAR*类型。用CComBSTR类:
    //put
    CComBSTR b(mOriginalData);
    b.CopyTo(pVal);//#include <atlbase.h>//get
    USES_CONVERSION;
    strcpy(mOriginalData,OLE2A(newVal));或_bstr_t b;
    b.Assgin(newVal);
    strcpy(mOriginalData,b);//implicit cast b to LPCSTR
    //#include <comdef.h>
      

  9.   

    我没注意到mOriginalData是Unsigned char*型,
    这样就行了,A2WBSTR((LPCTSTR)mOriginalData)
    在A2WBSTR里面实际上是执行了MultiByteToWideChar,SysAllocStringLen等函数,记住给BSTR变量赋值一定要分配内存,之后释放。
      

  10.   

    看了两位大哥的帮助我改成了这样:
    STDMETHODIMP DataSafe::get_OriginalData(BSTR *pVal)
    {    *pVal=A2BSTR((char *)mOriginalData);
         return S_OK;
    }
    STDMETHODIMP DataSafe::put_OriginalData(BSTR newVal)
    {
       USES_CONVERSION;
       strcpy((char *)mOriginalData,OLE2A(newVal));
       return S_OK;
    }
    编译倒是成功了,但我再VB里引用这个组件后,给OriginalData赋值时说是引用的内存不能写,是不是nichang()大哥说的释放内存的原因???我不知道怎么释放,在put,get里释放吗?
      

  11.   

    OriginalData是提供给外部赋字符串的。
      

  12.   

    STDMETHODIMP DataSafe::get_OriginalData(BSTR *pVal)
    {    *pVal=A2BSTR((char *)mOriginalData);
        return S_OK;
    }
    STDMETHODIMP DataSafe::put_OriginalData(BSTR newVal)

      USES_CONVERSION;
      strcpy((char *)mOriginalData,OLE2A(newVal));
      return S_OK;
    }
      

  13.   

    STDMETHODIMP DataSafe::get_OriginalData(BSTR *pVal)
    {
        SysFreeString(*pVal)
        *pVal=A2WBSTR((LPCTSTR)mOriginalData);
        return S_OK;
    }
    STDMETHODIMP DataSafe::put_OriginalData(BSTR newVal)

      USES_CONVERSION;
      WideCharToMultiByte(CP_ACP,0,newVal,-1,mOriginalData,sizeof(mOriginalData),NULL,NULL);
      return S_OK;
    }