首页 > 解决方案 > “错误'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
  1. 我可以使用“_tfopen”而不是“fopen”(用于发布版本)和“_wfopen”(用于调试版本)

    f = _tfopen(文件名, _T("r"));

代替

f = fopen(fileName,"r");  // For release build
f = _wfopen(fileName, L"r"); // For Debug build

请帮助我。

标签: c++unicodemfc

解决方案


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 类型,但现在很少需要它。


推荐阅读