ATL7.0:DLL
CString m_ResultText;
STDMETHODIMP CMain::Search(BSTR strKey)
{
.......
m_ResultText=.......;
return S_OK;
}
STDMETHODIMP CMain::get_ResultText(BSTR* pVal)
{
USES_CONVERSION;
CComBSTR bstrTemp(m_ResultText);
MessageBox(0,OLE2A(bstrTemp),"ATL in!",0);
*pVal = bstrTemp.Detach();
return S_OK;
}VB 6.0:EXE
dim a
set a =CreateObject("searcher.Main")
a.Search "......."
MsgBox a.Result,,"VB in!"第一次弹出对话框出现的结果是我想要的结果,第二次弹出对话框时,只是第一次对话框中字符串的一部分,请问这是为什么?怎样解决?
CString m_ResultText;
STDMETHODIMP CMain::Search(BSTR strKey)
{
.......
m_ResultText=.......;
return S_OK;
}
STDMETHODIMP CMain::get_ResultText(BSTR* pVal)
{
USES_CONVERSION;
CComBSTR bstrTemp(m_ResultText);
MessageBox(0,OLE2A(bstrTemp),"ATL in!",0);
*pVal = bstrTemp.Detach();
return S_OK;
}VB 6.0:EXE
dim a
set a =CreateObject("searcher.Main")
a.Search "......."
MsgBox a.Result,,"VB in!"第一次弹出对话框出现的结果是我想要的结果,第二次弹出对话框时,只是第一次对话框中字符串的一部分,请问这是为什么?怎样解决?
我也遇到过这样的问题,是当提取一个字符串的MD5码的时候,用BSTR做参数就有错误,用CComBSTR就没有问题,我很奇怪。
改成
STDMETHODIMP CMain::get_ResultText(CComBSTR* pVal)
???????
改成
bstrTemp.CopyTo(pVal);试试
你的方法我试了,还是不行。
*pVal = ::SysAllocString(A2COLE(m_ResultText));
if (*pVal == NULL)
{
return E_OUTOFMEMORY ;
}
return S_OK ;
是因为字符串中包含了OLECHAR的结束符,导致转换时只截取一部分....可我后来也没解决
到底是哪的原因?
if (*pVal == NULL)
{
return E_OUTOFMEMORY;
}
return S_OK;
说得很在理,主要问题是CString与BSTR的结构不同,字符串的结束标记不同导致截断,在ATL Internals 中有详细的说明到这里下载完整应用,看看里面的字符串处理部分utitls.h、utitls.cpp,希望能对你有帮助http://www.microsoft.com/downloads/details.aspx?familyid=CE2CA4FD-2169-4FAC-82AF-770AA9B60D77&displaylang=en