【问题标题】:Is MAX_PATH always same size, even if _UNICODE macro is defined?MAX_PATH 是否总是相同的大小,即使定义了 _UNICODE 宏?
【发布时间】:2014-06-20 13:29:50
【问题描述】:

我应该给它腾出空间吗,像这样:

 len = MAX_PATH * sizeof(_TCHAR) + sizeof(_TCHAR);

或者是:

len = MAX_PATH + sizeof(_TCHAR);

存放包含 unicode 的路径的大小合适吗?

【问题讨论】:

    标签: c++ c winapi max-path


    【解决方案1】:

    MAX_PATH(始终为 260)以字符而非字节表示。

    在分配以字节大小表示的原始内存时使用第一个,例如:

    LPTSTR path = (LPTSTR) LocalAlloc(LMEM_FIXED, (MAX_PATH + 1) * sizeof(TCHAR));
    

    在分配以字符表示的内存时使用第二个,例如:

    TCHAR path[MAX_PATH + 1];
    

    LPTSTR path = new TCHAR[MAX_PATH +1];
    

    【讨论】:

    • 仅供参考,分配MAX_PATH个字符就够了,例如TCHAR szPath[MAX_PATH];。 NUL 字符已包含在数字中;见MSDN page on naming files
    【解决方案2】:

    MAX_PATHWindef.h 中定义为 260,与 Unicode 无关。

    如果您持有字节数,则第一种方法很好。第二种方法没有任何意义。如果你持有的字符数,你应该使用MAX_PATH+1

    【讨论】:

      【解决方案3】:

      MAX_PATH 宏定义(260 字节)是采用的 ANSI 标准。不幸的是,这个标准早在 32 位操作系统出现之前就已经开发出来了。

      目前,Unicode 版本的 (Windows) 文件库支持最多 32,767 字节的路径。 但是,MAX_PATH 的定义与(16 位)MS-DOS 的定义保持一致

      【讨论】:

      • 所以新应用不应该使用它?另外,这是否意味着来自msdn.microsoft.com/en-us/library/aa365200%28v=vs.85%29.aspx 的以下代码可能在新的 Windows 版本中失败?
      • @jack,MSDN代码有限;但是,我不确定“失败”这个词是否准确。
      • 'fail' 我的意思是,它确实使用了 MAX_PATH,现在
      • 请注意,只有 NTFS 支持 > MAX_PATH 长度的路径,并且只有在路径前加上 \\?\。标准 Win32 API 将拒绝没有此前缀的较长路径,因此严格地说它仅与 16 位应用程序相关(谁再使用 16 位应用程序?)
      • 32767 限制在哪里定义?什么限制了它?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2011-09-14
      • 2018-08-13
      • 1970-01-01
      • 2011-01-27
      • 2014-12-30
      • 1970-01-01
      相关资源
      最近更新 更多