STDMETHODIMP DataSafe::get_OriginalData(BSTR *pVal)
{
// TODO: Add your implementation code here
*pVal=SysAllocString(mOriginalData);
return S_OK;
}//mOriginalData的定义最好用_bst_t,这个东西太好使了
{
// TODO: Add your implementation code here
*pVal=SysAllocString(mOriginalData);
return S_OK;
}//mOriginalData的定义最好用_bst_t,这个东西太好使了
如果你使用BSTR我这是简单的,标准的,方法,如果你要让代码只是自已使用可以定义任意的类型,因为你自已会遵守你写的规则,如果你的代码别人可能用到(如VB),那么别人写程序会用标准的方法来写程序,得到的字符串很可能会出错
如果你使用BSTR我这是简单的,标准的,方法,如果你要让代码只是自已使用可以定义任意的类型,因为你自已会遵守你写的规则,如果你的代码别人可能用到(如VB),那么别人写程序会用标准的方法来写程序,得到的字符串很可能会出错
{
// TODO: Add your implementation code here
*pVal=_bstr_t(mOriginalData).copy();
return S_OK;
}只是最简单的,只有一行,而且不会产生内存泄露
STDMETHODIMP DataSafe::get_OriginalData(BSTR *pVal)
{
// TODO: Add your implementation code here
*pVal=A2WBSTR(mOriginalData);
return S_OK;
}
不过用*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;
}
mOriginalData是内部变量,作为参数传入 别人的DLL里的函数,因为那个函数里参数类型是unsigned char *,所以我把mOriginalData定义成unsigned char *,所以再get,put里出现类型转换的问题。
BSTR不是字符类型吗,怎么会提示unsigned short *呢??
//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>
这样就行了,A2WBSTR((LPCTSTR)mOriginalData)
在A2WBSTR里面实际上是执行了MultiByteToWideChar,SysAllocStringLen等函数,记住给BSTR变量赋值一定要分配内存,之后释放。
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里释放吗?
{ *pVal=A2BSTR((char *)mOriginalData);
return S_OK;
}
STDMETHODIMP DataSafe::put_OriginalData(BSTR newVal)
{
USES_CONVERSION;
strcpy((char *)mOriginalData,OLE2A(newVal));
return S_OK;
}
{
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;
}