如何在 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"));

在第二个错误中,如果Resultchar*(或可以隐式转换为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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将字符串转换为 char 数组?

如何在 C++ 中将 LPOLESTR 转换为 char*

如何在 C++ 中将字符串转换为 const char[]

如何在 C++ 中将 std::string 转换为 const char [重复]

在 C 和 C++ 中将 char 转换为 int

如何在 C++ CLR 中将数组<System::Byte> 转换为 char*?