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!"第一次弹出对话框出现的结果是我想要的结果,第二次弹出对话框时,只是第一次对话框中字符串的一部分,请问这是为什么?怎样解决?

解决方案 »

  1.   

    用CComBSTR试一下。
    我也遇到过这样的问题,是当提取一个字符串的MD5码的时候,用BSTR做参数就有错误,用CComBSTR就没有问题,我很奇怪。
      

  2.   

    把STDMETHODIMP CMain::get_ResultText(BSTR* pVal)
    改成
     STDMETHODIMP CMain::get_ResultText(CComBSTR* pVal)
    ???????
      

  3.   

    *pVal = bstrTemp.Detach();
    改成 
    bstrTemp.CopyTo(pVal);试试
      

  4.   

    To: Igj1012(进口超人:国产超人,你把洗脚水给我倒了~~) 
    你的方法我试了,还是不行。
      

  5.   

    USES_CONVERSION;
    *pVal = ::SysAllocString(A2COLE(m_ResultText));
    if (*pVal == NULL)
    {
    return E_OUTOFMEMORY ;
    }
    return S_OK ;
      

  6.   

    之前测试的时候,我也碰到过,转换BSTR后,字符串被截断.
    是因为字符串中包含了OLECHAR的结束符,导致转换时只截取一部分....可我后来也没解决
      

  7.   

    你返回的字符串很多吧?太多可能会造成这种情况或者字符串不是文本的也会.用VARIANT 传吧.
      

  8.   

    不行,我用VARIANT试了不行!
    到底是哪的原因?
      

  9.   

    *pVal = ::SysAllocString(L"怎么会呢?这样试试,把你的代码发给我看看。不可能有问题的");
    if (*pVal == NULL)
    {
    return E_OUTOFMEMORY;
    }
    return S_OK;
      

  10.   

    确实有这种问题存在,建议你在字符串的传递过程中进行base64编码,微软的MSDN上有字符串base64编解码的simple,可以拿来直接用。
      

  11.   

    这个问题应该是ANSI字符串和宽字符串的转换转换造成的,首先确定客户端和com服务器在相同的环境下(32系统)编译,另外注意UNICODE宏是否正确定义,再就是尽量避免使用CString。
      

  12.   

    我觉得在ATL中使用CString确实不好,转换太复杂了,建议全部使用BSTR
      

  13.   

    hqulyc((vc++++++++...死循环了)) 
    说得很在理,主要问题是CString与BSTR的结构不同,字符串的结束标记不同导致截断,在ATL Internals 中有详细的说明到这里下载完整应用,看看里面的字符串处理部分utitls.h、utitls.cpp,希望能对你有帮助http://www.microsoft.com/downloads/details.aspx?familyid=CE2CA4FD-2169-4FAC-82AF-770AA9B60D77&displaylang=en