【问题标题】:How can a path be stored in this kind of structure, and how to convert it to something else?路径如何存储在这种结构中,以及如何将其转换为其他内容?
【发布时间】:2025-12-01 15:15:01
【问题描述】:

我正在查看FastCopy 的代码。我想添加一些选项,以便将文件删除到回收站而不是永久删除。

我遇到的第一个问题是路径的存储方式 - 作为BYTE[1] 类型。我认为它可能是一些指向真实路径的指针,但如果它只是一个字节,则可能不是。完整结构见下文:

struct MoveObj {
    _int64      fileID;
    _int64      fileSize;
    enum        Status { START, DONE, ERR } status;
    DWORD       dwFileAttributes;
    BYTE        path[1];
};

知道这意味着什么吗?

我的第二个问题是我需要将此字符串转换为一些名为“PCZZTSTR”的可怕 MS 类型,以便它可以与 SHFILEOPSTRUCT structure 一起使用。有什么建议我可以如何进行这种转换?

【问题讨论】:

标签: c++ c string winapi type-conversion


【解决方案1】:

struct 末尾的单元素数组 path[1] 只是实现可变大小结构的通用 C 技巧。在 C99 标准之前,C 语言中不允许使用可变大小的结构,因此程序员以这种方式实现。

存储路径的字节序列从该数组的第一个元素 (path[0]) 开始,但为结构分配的内存比sizeof(MoveObj) 多,因此数组本身的长度超过一个字节。如果数组的长度没有存储在结构中,我猜它是零终止的。

PCZZTSTR 可能听起来很吓人,但本质上它只是一个简单的 C 风格字符串 TCHARs,以 两个 '\0' 字符结尾。 P(指向 a 的指针)、CZ(C 样式,以零结尾) Z(双零结尾)、T(TCHAR)、STR(字符串)。

您必须将path 中的字节转换为TCHARs(在旧平台中是正常的chars,在现代基于Unicode 的Windows 中是WCHARs),再把\0 放在字符串的结尾,你得到了PCZZTSTR

【讨论】:

    最近更新 更多