c++ - “错误'SetWindowTextA':不是'CStatic'和char *fgets(char *,int,FILE *)的成员:无法将参数1从'TCHAR'转换为'char *'
问题描述
我将我的 C++ 项目从 Visual Studio 2005 迁移到 Visual Studio 2017 Professional,当我在调试和发布模式下构建时,我收到以下错误:
1.
在调试版本中,当我使用 SetWindowTextA 时,如下所示,我收到错误“错误 C2039 'SetWindowTextA': is not a member of 'CStatic'
m_status_text.SetWindowTextA(theStr);
m_status_text 被声明为 CStatic,如下所示:
CStatic m_status_text;
如果我使用 SetWindowTextW,它会在 Release Build 中引发错误。
m_status_text.SetWindowTextW(theStr);
当我将其更改为“SetWindowText”时,如下所示,它适用于调试和发布版本。这是正确的方法吗?
m_status_text.SetWindowText(theStr);
据我所知,当我们使用“SetWindowText”时,在 Unicode 格式中它会将其视为“SetWindowTextW”,而对于多字节字符集格式,它将视为“SetWindowTextA”。
但是 SetWindowText 如何用于调试和发布版本?
2.
如果我使用“fgets”,我们是否可以像在调试版本中一样使用“_fgetts”而不是“fgets”(用于发布版本)“fgetws”(用于调试版本),我收到以下错误:
char fgets(char , int, FILE*): 无法将参数 1 从 'TCHAR[260]' 转换为 'char*'
fgets(currDir,MAX_PATH,f); // For release build
fgetws(currDir, MAX_PATH, f); // For Debug build
我可以使用“_tfopen”而不是“fopen”(用于发布版本)和“_wfopen”(用于调试版本)
f = _tfopen(文件名, _T("r"));
代替
f = fopen(fileName,"r"); // For release build
f = _wfopen(fileName, L"r"); // For Debug build
请帮助我。
解决方案
Windows API 对每个处理或允许字符串作为参数的函数有 2 个变体:
- UNICODE,通常函数名以 W 结尾
- ANSI:函数名将以 A 结尾
然后,Windows API 为所有这些函数提供了一个通用变体,没有尾随的 A 或 W 字母,它将映射到上述之一(A 或 W),具体取决于是否定义了 UNICODE。
例子:
设置窗口文本
映射到:
-如果未定义 UNICODE (=> ANSI) ,则为SetWindowTextA
-如果定义了 UNICODE,则为SetWindowTextW
UNICODE 变体将字符串处理为 wchar_t*,而 ANSI 变体将字符串处理为 char*。
TCHAR 是一种宏定义的字符类型,根据是否定义了 UNICODE 映射到 char 或 wchar_t:
- TCHAR = char 如果未定义 UNICODE
- TCHAR = wchar_t 如果定义了 UNICODE
对于“现代”Windows 应用程序,VS2017 默认使用 UNICODE 模式(这是 VC++ 项目文件的一个选项),我建议您继续使用,除非您绝对必须支持旧版本的 Windows(即 98)。
使用 UNICODE 模式,您将使用 SetWindowTextW() 函数变体(或只是 SetWindowText()),您将向其传递 wchar_t*(或 TCHAR*)字符串。
如果您需要在 ANSI 和 UNICODE 模式下支持或编译项目,则可能需要使用 TCHAR 类型,但现在很少需要它。
推荐阅读
- c# - 无法启动服务挂载被拒绝 '/usr/local/share/dotnet/sdk/NuGetFallbackFolder\r\n' 不是来自 macOS X 的共享并且 docker 不知道
- input - 如何阻止在输入标签上输入“qq.com”?
- python - Codechef 上的错误答案
- c# - 如何在应用程序内关闭时重新启动应用程序
- google-sheets - 如何使用列作为标识符
- python - pycharm可以通过ssh连接wsl但不能在wsl中使用python
- javascript - 仅在没有 jQuery 的情况下完成 first 后调用语句
- python - AttributeError:模块“h5py.tests.old”没有属性“模块”
- java - 插入到具有未定义列数的mysql
- python - Python中连续数据的箱线图