VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 802|回复: 9

[求助] CString类型问题

[复制链接]
41_avatar_middle
online_vip 发表于 2016-7-21 11:25:05 | 显示全部楼层 |阅读模式
第一个问题:
写了一个函数返回CString类型,如下
CString CMFCTestDlg::GetBrows()
{
        CString strBrows;
        BROWSEINFO mBrowse={0};
        mBrowse.hwndOwner = m_hWnd;
        mBrowse.ulFlags = BIF_EDITBOX;
        mBrowse.lpfn = BrowseCallbackProc;
        ITEMIDLIST* IdList = SHBrowseForFolder(&mBrowse);
        if (IdList!=NULL)
        {
                SHGetPathFromIDList(IdList,strBrows.GetBufferSetLength(MAX_PATH));
        }
        UpdateData(FALSE);
        CoTaskMemFree(IdList);
        return strBrows;
}

在另一个函数中接收这个返回值,
CString strBrows = GetBrows();
strFileName = m_ctrlFileList.GetItemText(nItem,0);
strPath = strBrows + '\\' + strFileName;

strPath后面两个 '\\' + strFileName为什么加不上去,得到的值总是strBrows。

第二个问题:
CString成员函数GetBuffer,GetBufferSetLength,LockBuffer这些成员函数有什么区别,老是搞不明白,分别在什么情况下使用它们呢。




上一篇:static 问题
下一篇:SYSTEMTIME指针问题
51_avatar_middle
online_admins 发表于 2016-7-21 13:12:14 | 显示全部楼层
strPath = strBrows + '\\' + strFileName;
改成:
strPath = strBrows + _T("\\") + strFileName;

GetBuffer 是返回内部的缓冲区指针,GetBufferSetLength 也是返回内部缓冲区指针,但是需要指定一个长度,如果这个长度比字符串的长度长,那么会申请空间的
41_avatar_middle
ico_lz  楼主| 发表于 2016-7-21 13:32:19 | 显示全部楼层
Syc 发表于 2016-7-21 13:12
strPath = strBrows + '\\' + strFileName;
改成:
strPath = strBrows + _T("\\") + strFileName;

老大,改成这样还是不行CString类型问题
CString类型问题
51_avatar_middle
online_admins 发表于 2016-7-21 14:48:46 | 显示全部楼层
liguolong 发表于 2016-7-21 13:32
老大,改成这样还是不行


不应该啊,那你就改成这样:
strPath.Format(_T("%s%s%s"), strBrows, _T("\\"), strFileName);
41_avatar_middle
ico_lz  楼主| 发表于 2016-7-21 15:10:41 | 显示全部楼层
Syc 发表于 2016-7-21 14:48
不应该啊,那你就改成这样:
strPath.Format(_T("%s%s%s"), strBrows, _T("\\"), strFileName);

这样可以,可是加号为什么加不上去呢
51_avatar_middle
online_admins 发表于 2016-7-21 21:08:36 | 显示全部楼层
liguolong 发表于 2016-7-21 15:10
这样可以,可是加号为什么加不上去呢

我也很纳闷,正常来说应该没问题的
10_avatar_middle
在线会员 发表于 2016-7-25 10:17:48 | 显示全部楼层
MSDN上说了
If you use the pointer returned by GetBufferSetLength to change the string contents, you may need to call ReleaseBuffer before using any other CSimpleStringT member methods.
调用GetBufferSetLength 就必需调用ReleaseBuffer否则后面的操作不起作用。
41_avatar_middle
ico_lz  楼主| 发表于 2016-7-26 08:31:28 | 显示全部楼层
he_minghao007 发表于 2016-7-25 10:17
MSDN上说了
If you use the pointer returned by GetBufferSetLength to change the string contents, you ...

没用的,试过了
10_avatar_middle
在线会员 发表于 2016-7-26 16:41:02 | 显示全部楼层

CString类型问题
41_avatar_middle
ico_lz  楼主| 发表于 2016-7-27 10:26:51 | 显示全部楼层

可以了,谢谢,我在ReleaseBuffer里面加了参数MAX_PATH。关于这几个函数GetBuffer,GetBufferSetLength,ReleaseBuffer,ReleaseBufferSetLength一直都没怎么搞明白,能帮忙解释一下吗
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-3-25 13:00

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表