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

cctrys 2007-10-09 09:55:47
大家好,小弟最近在做一个小程序,以前把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中的字符串值虽然一样,可是换完后,剪贴版中的内容就是乱码了,不知道怎么回事啊,还请大家指点指点我啊? 谢谢了...
...全文
964 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
aopha 2007-10-10
  • 打赏
  • 举报
回复
src.GetBuffer(); 返回的是一个指针。
你这样使用根本没有修改pBuf所指的内容,按下面这样就可以了,不过好像没有必要。

strcpy_s(pBuf,src.GetLength()+1, src.GetBuffer() );
src.ReleaseBuffer();
cctrys 2007-10-10
  • 打赏
  • 举报
回复
非常感谢大家的帮助和对我的指导!~~~我以后会更努力的好好学的,呵呵!
sinkileu 2007-10-10
  • 打赏
  • 举报
回复
晕, 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即可.

好好学习喔~~
danscort2000 2007-10-10
  • 打赏
  • 举报
回复
(char * )(const char * )src;

src指CString对象

还可以使用

(char * )&src[0];
jixingzhong 2007-10-10
  • 打赏
  • 举报
回复
仔细看看文档

Returns a pointer to the internal character buffer for the CString object. The returned LPTSTR is not const and thus allows direct modification of CString contents。
【返回的是指针,允许修改】

If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions.
【对GetBuffer返回的指针使用之后需要调用ReleaseBuffer,这样才能使用其他Cstring的operations】
Leon8086 2007-10-10
  • 打赏
  • 举报
回复
LZ你对指针,C风格字符串操作和CString的理解,都有问题……这个已经不知从何说起了……
BenjaminHuang 2007-10-10
  • 打赏
  • 举报
回复
CString src("ClipBoardOk");
构造src对象的时候只是把"ClipBoardOk"这个常量字符串拷贝入了对象的缓冲区内,当对象被析构的时候,这段缓冲区的内容就被回收了。
如果将clipborad要拷贝的内容指向这个缓冲区的话,当对象生命周期结束时,拷贝的内容就变得不可预知了。
随笔 - 764 文章 - 3 评论 - 196 CString,string,char*之间的换() 这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差。string是使用STL时必不可少的类型,所以是做工程时必须熟练掌握的;char*是从学习C语言开始就已经和我们形影不离的了,有许多API都是以char*作为参数输入的。所以熟练掌握三者之间的换十分必要。 以下我用简单的图示指出三者之间的关系,并以标号对应换的方法。 1 string to CString CString.format("%s",string.c_str()); 2 CString to string string str(CString.GetBuffer(str.GetLength())); 3 string to char * char *p=string.c_str(); 4 char * to string string str(char*); 5 CString to char * strcpy(char,CString,sizeof(char)); 6 char * to CString CString.format("%s",char*); CString的format方法是非常好用的。string的c_str()也是非常常用的,但要注意和char *换时,要把char定义成为const char*,这样是最安全的。 以上函数UNICODE编码也没问题:unicode下照用,加个_T()宏就行了,像这样子_T("%s") 补充: CString 可能是 CStringW/CStringA,在与 string 换时,如果是 CStringW,还涉及编码换问题。下面以 CStringA 来说明。 1 string to CString CString.format("%s",string.c_str()); CStringA = string.c_str() 就可以了 2 CString to string string str(CString.GetBuffer(str.GetLength())); GetBuffer 有参数的话,可能导致内部的分配空间动作,要进行后续 ReleaseBuffer 操作。 string = CStringA string = CStringA.GetBuffer(); 3 string to char * char *p=string.c_str(); 4 char * to string string str(char*); 5 CString to char * strcpy(char *,CString,sizeof(char)); 按照 3 风格,这里应该 char * = CStringA; 或者 char *p = CStringA.GetBuffer(); 6 char * to CString CStringA = char * 就可以了

65,212

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧