如何将路径存储在这种结构中,以及如何将其转换为其他结构?

lau*_*ent 3 c c++ string winapi type-conversion

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

我遇到的第一个问题是存储路径的方式 - 作为一种BYTE[1]类型.我认为它可能是一些指向真实路径的指针,但可能不是它只是一个字节.请参阅下面的完整结构:

struct MoveObj {
    _int64      fileID;
    _int64      fileSize;
    enum        Status { START, DONE, ERR } status;
    DWORD       dwFileAttributes;
    BYTE        path[1];
};
Run Code Online (Sandbox Code Playgroud)

知道这是什么意思吗?

我的第二个问题是我需要将此字符串转换为一些名为"PCZZTSTR"的可怕MS类型,以便它可以与SHFILEOPSTRUCT结构一起使用.有什么建议我怎么做这个转换?

buc*_*buc 6

一元件阵列path[1]以使得端struct只是一个大致C特技实现可变尺寸的结构.在C99标准之前,C语言中不允许使用可变大小的结构,因此程序员以这种方式实现它.

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

PCZZTSTR可能听起来很可怕,但实际上它只是一个简单的C风格的字符串,TCHAR两个 '\0'字符结尾.P(指向a的指针),CZ(C型,零终止)Z(双零终止),T(TCHAR),STR(串).

你必须将字节转换pathTCHARs(char在旧平台中是正常的s,WCHAR在现代的基于Unicode的Windowses中是s),\0在字符串的末尾添加另一个,然后你得到了PCZZTSTR.