BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #26848同步于 2009/7/31
CPP机器人发帖

[合集] VS2005 遇到的一个类型转换的问题,求牛人解答!谢谢!

shenlei
2009/7/31镜像同步0 回复
☆─────────────────────────────────────☆ huahua00 (lala) 于 (Thu Jul 30 17:56:29 2009) 提到: 在VS05的环境里建立的工程,使用MFC编程,选了支持unicode选项,之后就出了一些类型转换的问题。 edit1是一个EditControl类型的控件,用作输入 sum是一个EditControl类型的空间,用作输出 CString str;//想用这个保存控件里的字符值 double dsum=0;//再把字符值放到这个变量里面 edit1.GetWindowTextW(LPTSTR(LPCTSTR(str)),10);//很疑惑这里的类型转换 dsum=_wtof(str); str.Format(dsum,10); sum.SetWindowTextW(LPCTSTR(str)); 首先是,我想选了unicode之后建立的CString应该都默认支持宽字节的,为什么 edit1.GetWindowTextW(str,10); 这样的语句是错的呢? 还有如果我选了unicode之后,LPTSTR和LPCTSTR不是应该是一种类型吗?为什么必须要强制转换2次才能通过编译? 最后,这个程序运行之后又警告,忽略之后执行,在edit1中输入了任意数字,选择执行,跳出对话框报错,选择忽略,sum控件可以正确显示数字.. ☆─────────────────────────────────────☆ jokerlee (Jackal The Dire) 于 (Thu Jul 30 18:29:26 2009) 提到: 把编译器的错误信息贴出来~~ ☆─────────────────────────────────────☆ huahua00 (lala) 于 (Thu Jul 30 18:36:39 2009) 提到: 1>stdafx.cpp 1>正在编译... 1>MFC6.cpp 1>MFC6Dlg.cpp 1>c:\users\feng\documents\visual studio 2005\projects\mfc6\mfc6\mfc6dlg.cpp(204) : warning C4244: “参数”: 从“double”转换到“UINT”,可能丢失数据 1>正在生成代码... 1>正在编译资源... 1>正在编译资源清单... 1>正在链接... 1>LINK : 没有找到 C:\Users\Feng\Documents\Visual Studio 2005\Projects\MFC6\Debug\MFC6.exe 或上一个增量链接没有生成它;正在执行完全链接 1>正在嵌入清单... 1>生成日志保存在“file://c:\Users\Feng\Documents\Visual Studio 2005\Projects\MFC6\MFC6\Debug\BuildLog.htm” 1>MFC6 - 0 个错误,1 个警告 ========== 全部重新生成: 1 已成功, 0 已失败, 0 已跳过 ========== ☆─────────────────────────────────────☆ huahua00 (lala) 于 (Thu Jul 30 18:36:56 2009) 提到: 这是警告,运行的时候就有问题了。。 ☆─────────────────────────────────────☆ jokerlee (Jackal The Dire) 于 (Thu Jul 30 18:39:31 2009) 提到: 有一个问题可以回答, LPTCSTR是常类型的LPTSTR,而GetWindowTextW的第一个参数是用来存放返回的windowtext,是要被改变的,显然不能是常数类型。 直接一次转成LPTSTR就行,没必要转两次 ☆─────────────────────────────────────☆ jokerlee (Jackal The Dire) 于 (Thu Jul 30 18:40:55 2009) 提到: 这个warning是在哪一行? 【 在 huahua00 的大作中提到: 】 : 1>stdafx.cpp : 1>正在编译... : 1>MFC6.cpp : ................... ☆─────────────────────────────────────☆ huahua00 (lala) 于 (Thu Jul 30 21:32:56 2009) 提到: 这就是我疑惑的地方,如果改成你这样的话会报错 1>c:\users\feng\documents\visual studio 2005\projects\mfc6\mfc6\mfc6dlg.cpp(195) : error C2440: “<function-style-cast>”: 无法从“CString”转换为“LPTSTR” 【 在 jokerlee 的大作中提到: 】 : 有一个问题可以回答, : LPTCSTR是常类型的LPTSTR,而GetWindowTextW的第一个参数是用来存放返回的windowtext,是要被改变的,显然不能是常数类型。 : 直接一次转成LPTSTR就行,没必要转两次 ☆─────────────────────────────────────☆ huahua00 (lala) 于 (Thu Jul 30 21:33:59 2009) 提到: 1>c:\users\feng\documents\visual studio 2005\projects\mfc6\mfc6\mfc6dlg.cpp(204) : warning C4244: “参数”: 从“double”转换到“UINT”,可能丢失数据 str.Format(dsum,10); 这里的。。 【 在 jokerlee 的大作中提到: 】 : 这个warning是在哪一行? ☆─────────────────────────────────────☆ jokerlee (Jackal The Dire) 于 (Thu Jul 30 23:07:35 2009) 提到: 【 在 huahua00 的大作中提到: 】 : 这就是我疑惑的地方,如果改成你这样的话会报错 : 1>c:\users\feng\documents\visual studio 2005\projects\mfc6\mfc6\mfc6dlg.cpp(195) : error C2440: “<function-style-cast>”: 无法从“CString”转换为“LPTSTR” 这句话不是说的很清楚么, CSrting 类型的变量不能隐式转换成LPTSTR, 也就是w_char*, 但是LPTSTR可以隐式转换成CString, 因为CString有一个以LPTSTR为参数的构造函数 这个问题这样解决 String str; sum.SetWindowTextW(str.GetBuffer(0)); str.GetBuufer(0)返回一个LPTSTR, 是str内部的buffer, 也就是CString的内容。 需要注意的是, 修改通过GetBuffer()得到的字符串, 会使原来CString变量也发生改变,所以安全的做法是这样: LPCTSTR(str.GetBuffer(0)) ☆─────────────────────────────────────☆ huahua00 (lala) 于 (Fri Jul 31 11:54:15 2009) 提到: 说的很明白,谢谢了! 【 在 jokerlee 的大作中提到: 】 : 这句话不是说的很清楚么, CSrting 类型的变量不能隐式转换成LPTSTR, 也就是w_char*, 但是LPTSTR可以隐式转换成CString, 因为CString有一个以LPTSTR为参数的构造函数 : 这个问题这样解决 : String str; : ...................
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。