论坛首页· 友情链接申请·申请版主· 广告投放· 道具中心· 设为首页· 收藏本站
 19 12
发新话题
打印

LPTSTR类型转换为char*

回复 10# 的帖子

MFC中的类成员函数要用LPTSTR,可是还要用到传统的字符串处理函数,不得不混用啊
因为梦想而努力,因为有你而精彩!
mail: qianzongming@gmail.com

TOP

非要用c函数的话tchar.h中定义了c字符串函数的宏_t开头,比如_tcslen,还有微软扩展的较为安全的一组函数,比如_tcslen_s,多一个后缀_s,就是safe的意思

操作系统也有字符处理函数,lstr开头,比如lstrlen,还有其他一些和c函数名字很类似的函数,比如IsCharAlpha等等

shlwapi.h也提供了一组字符处理函数名字和c非常类似,只是区分大小写,比如StrCpy

由于安全性问题,微软后来又开发了一套字符串处理函数包含在strsafe.h中,比如StringCbCopy

上面提到的那些函数都有Unicode和ANSI版本,用strsafe.h里的函数比较安全

你要先理清楚Windows类型到底是什么,其次是API的版本问题,一般写的MessageBox之类都是宏,最终编译时看你有没有定义UNICODE(对于Windows API)和_UNICODE(C运行时库)来决定到底调用那个版本的函数。

其实个人感觉SDK入门比较好,MFC太乱了,什么都有,从界面到实现,一层层的封装,可能上手快,但其实不利于真正的理解

TOP

我找过对应的宽字符函数,没找到。我用的是atoi(),itoa()。SDK我也编过一些了。其实在vc++6.0中不存在这些问题的。vs2008逼着我去解决。
因为梦想而努力,因为有你而精彩!
mail: qianzongming@gmail.com

TOP

不是vs2008的问题
建议看看《Windows核心编程》,最新版是Windows Via C/C++ ,看完第二章应该能搞清楚这些了

TOP

我正在看,相关章节看过了。
有些问题在VC++6.0中是不存在的,像可以直接把char*赋给LPTSTR 参数,我在那个里面写过多次了。VS2008的约束似乎强一些,那个不能用,即使取消定义UNICODE。我就是不知道为什么,char* ->CHAR*->LPWSTR->LPTSTR,应该是同一种类型的,可就是报错。关于字符的资料找了好多了,都大同小异,参阅的资料都够一本书了,都是讲那么点东西。你也试试VS2008吧,目前就这么比较棘手,其他的体验都很好,比VC开发高效多了
因为梦想而努力,因为有你而精彩!
mail: qianzongming@gmail.com

TOP

VS2008我用了几个月了

“char* ->CHAR*->LPWSTR->LPTSTR,应该是同一种类型”,不对

char*等同于CHAR*,也等同于LPSTR
LPWSTR是wchar_t*
LPTSTR 定义UNICODE时时LPWSTR,未定义UNICODE时是LPSTR
复制内容到剪贴板
代码:
#undef UNICODE
#undef _UNICODE

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

int _tmain()
{
    LPTSTR szString;
    char szName[32] = "string test";

    szString = szName;

    _tprintf(szString);

    return 0;
}

TOP

中间的LPWSTR应该是LPSTR的,我两种编码都试过。
发现原因了,原来在属性页里对字符的设置只在预编译文件中有效。其它文件中还是要设置。
另外,还有点不放心的是转换函数。毕竟MBCS和UNICODE是两套编码,而从库函数的mbstowcs等的名字上来看,处理的是MBCS编码,库函数的代码我想我是不会去看了。
因为梦想而努力,因为有你而精彩!
mail: qianzongming@gmail.com

TOP

代码贴出来看看,我觉得应该不用那么麻烦

TOP

就是实现获取几个文本编辑控件的字符串,然后转化为数字,运算,然后在另一个文本框中输出,当然也要先转化成字符。就这么个过程。实现方式有很多种,早就解决了,我就是为了多了解一些而已。
因为梦想而努力,因为有你而精彩!
mail: qianzongming@gmail.com

TOP

 19 12
发新话题