CString的变量如何转换成char*,已经上网查过了,但是我还是不懂?

youzhj 2011-04-24 03:49:14

函数格式:BOOL __stdcall SetVTText(char* VarName,char* setText);
我给两个文本输入框添加了CString类型的变量:C_WriteInto_VT01和C_WriteInto_VT02
确认按钮添加的消息响应函数如下:
void CWriteIntoDlg::OnBnClickedOk()
{
SetVTText("VT01",(char*)(&C_WriteInto_VT02));
SetVTText("VT02",(char*)(&C_WriteInto_VT02));
OnCancel();
}
肯定有问题,网上我查过了有三种方法,我是这两天才开始学习C++的,也许问题都没描述清楚,请大侠们指导一下。
...全文
153 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysjyniiq 2011-04-24
  • 打赏
  • 举报
回复
#include <atlconv.h>//复制时忘打<>
ysjyniiq 2011-04-24
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 youzhj 的回复:]
麻烦问一下,我现在用一下几种办法都可以成功执行,那哪种最好呢?
1、(char *)((LPCTSTR)C_WriteInto_VT1)
2、(LPTSTR)((LPCTSTR)C_WriteInto_VT01)
3、(char *)C_WriteInto_VT02.GetBuffer( C_WriteInto_VT02.GetLength() )
我对这些其实都不太懂,这两天刚开始开C+……
[/Quote]
每一种都是危险!没有考虑Unicode和非Unicode环境


#include atlconv.h

//不管是不是Unicode都管用,不适用于VC6.0,VC6没有CT2A
SetVTText("VT01",CT2A((LPCTSTR)(C_WriteInto_VT02)));

到于CString::GetBuffer是初学者经常用错的地方,GetBuffer会内部重新申请内存,再将原来的字串复制到新的空间,主要用于需要用TCHAR *指针方式修改CString的地方。如果仅仅是只读其字符串指针直接用(LPCTSTR),CString内部已经重载了这个操作符。
youzhj 2011-04-24
  • 打赏
  • 举报
回复
大哥,最后一个问题,在你教我的办法中,有GetBuffer这个函数,那用完了,有没有必要释放掉啊,不释放有啥影响么?[Quote=引用 16 楼 ihatec2s3d4n5 的回复:]
编译出错信息呢?
仔细看编译输出信息就能看出来


引用 14 楼 youzhj 的回复:
非常感谢你的耐心解答,我就是还有一个问题,字符集我设置成UNICODE的话,就不能成功编译,设置成多字节就可以编译了,这有什么区别呢?

引用 13 楼 ihatec2s3d4n5 的回复:
本身CString就有一个从CString对象返回串地址的操作符
LPCTSTR
最多可能需要一……
[/Quote]
youzhj 2011-04-24
  • 打赏
  • 举报
回复
麻烦问一下,我现在用一下几种办法都可以成功执行,那哪种最好呢?
1、(char *)((LPCTSTR)C_WriteInto_VT1)
2、(LPTSTR)((LPCTSTR)C_WriteInto_VT01)
3、(char *)C_WriteInto_VT02.GetBuffer( C_WriteInto_VT02.GetLength() )
我对这些其实都不太懂,这两天刚开始开C++的。
[Quote=引用 15 楼 jadyzdr 的回复:]
楼主最好用CString类的GetBuffer函数实现,char *)((LPCTSTR)C_WriteInto_VT1)这种转换改变了类的结构,你用这种转换后再次调用GetLength函数得不到你想要的结构,我在这个方面用char *)((LPCTSTR)C_WriteInto_VT1)
吃过一次亏的
[/Quote]
Ihatec2s3d4n5 2011-04-24
  • 打赏
  • 举报
回复
编译出错信息呢?
仔细看编译输出信息就能看出来

[Quote=引用 14 楼 youzhj 的回复:]
非常感谢你的耐心解答,我就是还有一个问题,字符集我设置成UNICODE的话,就不能成功编译,设置成多字节就可以编译了,这有什么区别呢?

引用 13 楼 ihatec2s3d4n5 的回复:
本身CString就有一个从CString对象返回串地址的操作符
LPCTSTR
最多可能需要一个类型转换 (char *)((LPCTSTR)C_WriteInto_VT1)


引用 8 ……
[/Quote]
jadyzdr 2011-04-24
  • 打赏
  • 举报
回复
楼主最好用CString类的GetBuffer函数实现,char *)((LPCTSTR)C_WriteInto_VT1)这种转换改变了类的结构,你用这种转换后再次调用GetLength函数得不到你想要的结构,我在这个方面用char *)((LPCTSTR)C_WriteInto_VT1)
吃过一次亏的
youzhj 2011-04-24
  • 打赏
  • 举报
回复
非常感谢你的耐心解答,我就是还有一个问题,字符集我设置成UNICODE的话,就不能成功编译,设置成多字节就可以编译了,这有什么区别呢?[Quote=引用 13 楼 ihatec2s3d4n5 的回复:]
本身CString就有一个从CString对象返回串地址的操作符
LPCTSTR
最多可能需要一个类型转换 (char *)((LPCTSTR)C_WriteInto_VT1)


引用 8 楼 youzhj 的回复:
不好意思,我刚刚自己把C_WriteInto_VT1变量之前的&amp;符号去掉了,这样就正确了,我没搞清楚这是什么意思?

引用 7 楼 ihatec2s……
[/Quote]
Ihatec2s3d4n5 2011-04-24
  • 打赏
  • 举报
回复
本身CString就有一个从CString对象返回串地址的操作符
LPCTSTR
最多可能需要一个类型转换 (char *)((LPCTSTR)C_WriteInto_VT1)

[Quote=引用 8 楼 youzhj 的回复:]
不好意思,我刚刚自己把C_WriteInto_VT1变量之前的&符号去掉了,这样就正确了,我没搞清楚这是什么意思?

引用 7 楼 ihatec2s3d4n5 的回复:
你再试:
C_WriteInto_VT1 = "this is a test";
SetVTText("VT01",(char *)C_WriteInto_VT1.GetBuffer( C_WriteInto_V……
[/Quote]
Ihatec2s3d4n5 2011-04-24
  • 打赏
  • 举报
回复
你现在可以把C_WriteInto_VT1="....."那句去掉,只保留:
SetVTText("VT01",(char *)C_WriteInto_VT1.GetBuffer( C_WriteInto_VT1.GetLength() ) );

再试,如果正确就好了,如果不正确,看看C_WriteInto_VT1里面有什么?

[Quote=引用 11 楼 youzhj 的回复:]
我按照你的意思试了,结果显示的是“this is a test”,这说明啥呢?

引用 7 楼 ihatec2s3d4n5 的回复:
你再试:
C_WriteInto_VT1 = "v";
SetVTText("VT01",(char *)C_WriteInto_VT1.GetBuffer( C_WriteInto_VT1.GetLength() ) );
如果这个正确, 你看看C_W……
[/Quote]
youzhj 2011-04-24
  • 打赏
  • 举报
回复
我按照你的意思试了,结果显示的是“this is a test”,这说明啥呢?[Quote=引用 7 楼 ihatec2s3d4n5 的回复:]
你再试:
C_WriteInto_VT1 = "v";
SetVTText("VT01",(char *)C_WriteInto_VT1.GetBuffer( C_WriteInto_VT1.GetLength() ) );
如果这个正确, 你看看C_WriteInto_VT1里到底原来存了什么


Quote=引用 6 楼 youzhj 的回复:]
写常……
[/Quote]
无水先生 2011-04-24
  • 打赏
  • 举报
回复
char *p = getbuffer();
youzhj 2011-04-24
  • 打赏
  • 举报
回复
不好意思,我刚刚自己把C_WriteInto_VT1变量之前的&符号去掉了,这样就正确了,我没搞清楚这是什么意思?[Quote=引用 7 楼 ihatec2s3d4n5 的回复:]
你再试:
C_WriteInto_VT1 = "this is a test";
SetVTText("VT01",(char *)C_WriteInto_VT1.GetBuffer( C_WriteInto_VT1.GetLength() ) );
如果这个正确, 你看看C_WriteInto_VT1里到底原来存了什么


Quote=引用 6 楼 youzhj 的回复:]
写常……
[/Quote]
Ihatec2s3d4n5 2011-04-24
  • 打赏
  • 举报
回复
你再试:
C_WriteInto_VT1 = "this is a test";
SetVTText("VT01",(char *)C_WriteInto_VT1.GetBuffer( C_WriteInto_VT1.GetLength() ) );
如果这个正确, 你看看C_WriteInto_VT1里到底原来存了什么


Quote=引用 6 楼 youzhj 的回复:]
写常量字符串是没有问题的,改成原来那样,通过textbox写进去的显示就是乱码。

引用 4 楼 ihatec2s3d4n5 的回复:
你可以先写常量字符串看看,比如:
SetVTText("VT01",(char*)("this is a test") );



引用 3 楼 youzhj 的回复:
引用 2 楼 ihatec2s3d4n5 的回复:
1. .GetBuff……
[/Quote]
youzhj 2011-04-24
  • 打赏
  • 举报
回复
写常量字符串是没有问题的,改成原来那样,通过textbox写进去的显示就是乱码。[Quote=引用 4 楼 ihatec2s3d4n5 的回复:]
你可以先写常量字符串看看,比如:
SetVTText("VT01",(char*)("this is a test") );



引用 3 楼 youzhj 的回复:
引用 2 楼 ihatec2s3d4n5 的回复:
1. .GetBuffer(...)
2.. (char *)((LPCTSTR)C_WriteInto_VT1)
我用你这种办法写进去后,显示出来的是乱码……
[/Quote]
youzhj 2011-04-24
  • 打赏
  • 举报
回复
好的,谢谢哈,我去试试。[Quote=引用 4 楼 ihatec2s3d4n5 的回复:]
你可以先写常量字符串看看,比如:
SetVTText("VT01",(char*)("this is a test") );



引用 3 楼 youzhj 的回复:
引用 2 楼 ihatec2s3d4n5 的回复:
1. .GetBuffer(...)
2.. (char *)((LPCTSTR)C_WriteInto_VT1)
我用你这种办法写进去后,显示出来的是乱码……
[/Quote]
Ihatec2s3d4n5 2011-04-24
  • 打赏
  • 举报
回复
你可以先写常量字符串看看,比如:
SetVTText("VT01",(char*)("this is a test") );


[Quote=引用 3 楼 youzhj 的回复:]
引用 2 楼 ihatec2s3d4n5 的回复:
1. .GetBuffer(...)
2.. (char *)((LPCTSTR)C_WriteInto_VT1)
我用你这种办法写进去后,显示出来的是乱码。
我是通过一个软件提供的API向里面的变量写字符串数据,是不是我哪里没有设置对啊?
[/Quote]
youzhj 2011-04-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ihatec2s3d4n5 的回复:]
1. .GetBuffer(...)
2.. (char *)((LPCTSTR)C_WriteInto_VT1)
[/Quote]我用你这种办法写进去后,显示出来的是乱码。
我是通过一个软件提供的API向里面的变量写字符串数据,是不是我哪里没有设置对啊?
Ihatec2s3d4n5 2011-04-24
  • 打赏
  • 举报
回复
1. .GetBuffer(...)
2.. (char *)((LPCTSTR)C_WriteInto_VT1)
Ihatec2s3d4n5 2011-04-24
  • 打赏
  • 举报
回复
如果不是使用了unicode等别的字符集,CString转换成char *本身CString类自己就提供了. 但没有一个是楼主现在代码写的方法.
请仔细看msdn的CString的帮助文档,比上网查还快.而且每次都可以这么做.

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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