如何在 C++(MFC) 中将 char* 转换为 LPCTSTR
Posted
技术标签:
【中文标题】如何在 C++(MFC) 中将 char* 转换为 LPCTSTR【英文标题】:how to convert char* to LPCTSTR in c++(MFC) 【发布时间】:2017-05-01 09:09:36 【问题描述】:我必须制作访问 .txt 文件的 MFC 应用程序。 以下代码是给定模板文件的一部分:
fopen(dlg.GetPathName());
但是,当我尝试运行给定的模板文件时,我收到错误,表明 char* 无法转换为 LPCTSTR。 我在网上做了一些研究,修改后程序运行良好:
USES_CONVERSION;
const char* cstr;
cstr = T2A((LPCTSTR)dlg.GetPathName());
~
fp = fopen(cstr, "r");
我之所以提到这一点,是因为我的编译器(VS 2017 社区)可能默认使用 unicode。我认为这是解决上述问题的关键:
我在窗口编辑控件上打印结果时遇到问题。
m_Result.SetWindowTextW((LPCTSTR)Result);
Result 包含要在编辑控件中显示的消息,其类型为 char*。每当我运行程序时,它都会显示在空白框□或中文中。我尝试使用 A2T 和 CA2T 转换结果,但这些都不起作用。
【问题讨论】:
解决您的问题的方法是阅读The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)。向对象抛出随机宏和 C 样式强制转换不是解决方案的一部分。(LPCTSTR)dlg.GetPathName()
和这个((LPCTSTR)Result)
-- 这些都是错误的。您不会通过强制转换从一种字符类型转换为另一种字符类型。你在这里所做的只是阻止编译器告诉你你的错误。删除强制转换,或者 1) 通过调用适当的函数正确地将从一种类型转换为另一种类型,或者 2) 从一开始就使用 正确 字符串类型。无论如何,你要么做 1) 要么 2) 没有任何 C 风格的演员表。
【参考方案1】:
可以使用 Microsoft 的 _wfopen()
函数(或 TCHAR
等效函数 _tfopen()
来修复第一个错误,以匹配 GetPathName()
而不是 fopen()
的 TCHAR
性质。这样,您不必'根本不需要将输入字符串转换为char*
:
fp = _wfopen(dlg.GetPathName(), L"r");
fp = _tfopen(dlg.GetPathName(), _T("r"));
在第二个错误中,如果Result
是char*
(或可以隐式转换为char*
的东西)并且LPCTSTR
映射到const wchar_t*
(因为UNICODE
已定义),那么您可以使用@ 987654336@就好了:
m_Result.SetWindowTextW(CA2CT(Result));
但是,由于 SetWindowTextW()
只期望 wchar_t*
而从不期望 TCHAR*
,请改用 CA2CW
:
m_Result.SetWindowTextW(CA2CW(Result));
或者,如果可能,您应该首先将Result
更改为使用wchar_t
而不是char
,然后您就不再需要转换了:
m_Result.SetWindowTextW(Result);
【讨论】:
以上是关于如何在 C++(MFC) 中将 char* 转换为 LPCTSTR的主要内容,如果未能解决你的问题,请参考以下文章