首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

CString转char * 用GetBuffer()方法,还是strcpy ?解决办法

2012-03-14 
CString转char *, 用GetBuffer()方法,还是strcpy ?大家好,小弟最近在做一个小程序,以前把CString类型转cha

CString转char *, 用GetBuffer()方法,还是strcpy ?
大家好,小弟最近在做一个小程序,以前把CString类型转char * 类型都是调用CString类型的GetBuffer()方法,也一直都用的很顺手,可是最近做的这个程序用到了剪贴版方面的知识结果就不一样了,实现代码如下:
if (OpenClipboard())
{
CString src("ClipBoardOk");
HANDLE hClip;
char *pBuf;
EmptyClipboard();
hClip = GlobalAlloc(GMEM_MOVEABLE, src.GetLength() + 1);
pBuf = (char *)GlobalLock(hClip);
strcpy_s(pBuf,src.GetLength()+1, src);
//pBuf = src.GetBuffer();
//src.ReleaseBuffer();
GlobalUnlock(hClip);
HANDLE h = SetClipboardData(CF_TEXT, hClip);
CloseClipboard(); 
}

程序中用到了strcpy_s()函数,把CString类型的src复制到了char *类型的pBuf中,这么做程序一切正常,剪贴版中也确实得到了"ClipBoardOk"字符串,不过用惯了GetBuffer()方法的我,当把strcpy_s()一行换成下面我注掉的两行时,两次pBuf中的字符串值虽然一样,可是换完后,剪贴版中的内容就是乱码了,不知道怎么回事啊,还请大家指点指点我啊? 谢谢了...

[解决办法]
晕, LZ没有理解指针呀!!!!

解释一下, 你可以这样想: 
pBuf = (char *)GlobalLock(hClip); //①
strcpy_s(pBuf,src.GetLength()+1, src); //②
第①句话是让pBuf指向所申请的资源hClip的首地址, 第②句是往hClip资源中拷贝数据, 只是借助pBuf这个指针来操作而已.

你如果把第②句改成
pBuf = src.GetBuffer(); 
src.ReleaseBuffer(); 
你就把pBuf指向另一个地方了, 而不再是资源hClip的首地址, 这样hClip中的内容并没有改变, 当然就不能改变剪切板中的内容了.

另外, GetBuffer和ReleaseBuffer主要用在需要改变CString中字符串的时候, 因为GetBuffer让你可以改变CString中的裸字符串, 当你只是读取CString中的字符串时, 例如拷贝, 则不用GetBuffer, 只需要直接类型转换成LPCTSTR即可.

好好学习喔~~

热点排行