【问题标题】:wcscpy Does Not Accept TCHAR in Destination Variablewcscpy 不接受目标变量中的 TCHAR
【发布时间】:2015-12-09 00:53:01
【问题描述】:

[VS10] 目的是将驱动器文字字符串复制到 *.dst 中

TCHAR *driveIDBase;
...
wcscpy_s (driveIDBase, MAX_PATH-3, L"\\\\?\\C:\\*");

这会产生错误

IntelliSense:重载函数“wcscpy_s”的实例不匹配 参数列表

请注意,ANSI 版本运行良好:

strcpy_s (driveIDBase, MAX_PATH-3, "C:\\*");

假设我们尝试明显的解决方法:

strcpy_s (driveIDBase, MAX_PATH-3, "\\?\C:\");

我们可以说演员 (wchar_t *) driveIDBase 可靠吗?也就是说,WIN32_FIND_DATAW 会将该字符串解释为“C:\”?

MSDN 的这句话又是什么意思?

“\\?\”前缀关闭路径字符串的自动扩展,

【问题讨论】:

  • 对我来说很好(VS2015)。 TCHAR 取决于项目中的字符集选择。是否设置为 Unicode?​​span>
  • @Bo 这是 MBCS。嘿,更改为 Unicode 会导致代码中出现大量“不兼容”类型错误——我想看看。在这里有 2015 年的 ISO。值得一试吗?
  • VS2015 不会在这里改变任何东西。 TCHAR 是 char 或 wchar_t,具体取决于该设置。如果您编写新软件,您可以只使用 wchar_t 并跳过 TCHAR 东西。这是为了简化为 Windows 95 和 Windows NT 编写代码而引入的。我们现在不常做的事情。

标签: c copy tchar wchar


【解决方案1】:

值得注意的是 TCHAR 的 Stack Overflow 定义:

char 或 wchar_t 的#define,用于移植古代窗口 应用程序。

正在组装的代码并不是一个古老的端口,尽管将其包含在当前项目中的最初原因是(在较旧的线程中)为了在某些 API 函数中进行转换而建议使用它。
由于 MBCS 的逐步淘汰,如 Bo 建议的那样,如今最好使用 Unicode 构建项目,这使得 TCHAR 宏的使用变得多余。
至于问题的第二部分,假设创建了一个宽字符目录:

%USERPROFILE%\This Is A SubDirectory of %USERPROFILE% Not C-Colon-Backslash-Users-Backslash-MyUserName-- Being the Expanded Directory Path We Intended to Use

我们注意到在 \\?\ 下不会在“C:\Users\MyUserName”中创建给定的子目录。事实上,在大多数情况下它不能,因为 C:\Users 永远不会在第一个实例中使用 \\?\ 前缀创建。

用另一个问题结束这部分答案:
关于 MSDN 中同一页面的另一条声明:

32,767 个字符的最大路径是近似值,因为 "\\?\" 前缀可以由系统在运行时扩展为更长的字符串 时间,并且这种扩展适用于总长度,

运行时的扩展不是自动的吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    相关资源
    最近更新 更多