原贴见 http://topic.csdn.net/u/20080428/13/e8c60d5a-8fcb-4b51-a697-53a069110c15.html?seed=1056738959,
我在我家里的机器,XP-SP2上安装了VC6(SP6),写了一个函数,
函数形如a(CString src){char* p = src.GetBuffer(0);} 调用a("test string"); 调试时发现p指向空字符串。百思不得其解。于是把整个项目COPY到单位上的机器,同样XP-SP2,VC6(SP6),可编绎后src.GetBuffer(0)居然返回正常! WHY?难道是我下载的两个VC版本有细微差别? 我这可是编绎的同一个项目呀~~ 真是难事了~各位D X帮忙看看这是啥问题 ~多谢了~

解决方案 »

  1.   

    我换了一台机器就可以了!难道因为我之前返回为空串的机器是64位CPU的关系吗??
      

  2.   


    真的! 我怀疑有可能是编绎器版本关系 请问怎样获取 _MSC_VER 这个值? 虽然我两台机器安装的都是 VC6(SP6),但我还是想看看 _MSC_VER 这个值
      

  3.   

    对比了一下,两台机器中 \VC98\Bin 下的各个EXE版本都是相同的
      

  4.   

    MFC有源码,你跟进去看看啊。
      

  5.   


    跟进去看了。LPTSTR CString::GetBuffer(int nMinBufLength)
    {
    ASSERT(nMinBufLength >= 0); if (GetData()->nRefs > 1 || nMinBufLength > GetData()->nAllocLength)
    {到IF这里就跳出了。。
      

  6.   

    CString CUtils::EncodeForm(CString src,DWORD codePage)
    {
    CString buf;
    if(encoding != GB2312)
    ConvertEncoding(src,GB2312,encoding);  
    char* p = src.GetBuffer(0);
    while(true)
    {
    int ch = (BYTE) (*(p++));
    if (ch == '\0') {
    break;
    }
    if (isalnum(ch) || ch == '_' || ch == '-' || ch == '.') {
    buf += (char)ch;
    }
    else if (isspace(ch)) {
    buf += '+';
    }
    else {
    char c[16];
                wsprintfA(c, "%%%02X", ch);

    buf += c;
    }
    }

    src.ReleaseBuffer();
    return buf;
    };调用 CUtils::EncodeForm("ddd",CP_ACP);返回为空串!调试发现到char* p = src.GetBuffer(0);就指向空了把项目转移到另一台机器编绎运行正常
      

  7.   

    1. 是不是在ConvertEncoding(src,GB2312,encoding);   中修改了src的值为空?
    2. 好象返回局部变量buf不是好的做法,如果返回的是常量,则不会有问题
      

  8.   

    顺便问下,Getbuffer(0)后也要releaseBuf?
      

  9.   


    没,ConvertEncoding(src,GB2312,encoding);去掉了照样会返回空串。