3

FastCopyのコードを見ています。ファイルが永久にではなくごみ箱に削除されるように、いくつかのオプションを追加したいと思います。

私が遭遇した最初の問題は、パスがBYTE[1]タイプとして保存される方法です。実際のパスを指しているポインタかもしれないと思いましたが、1 バイトだけの場合はおそらくそうではありません。完全な構造については、以下を参照してください。

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

それが何を意味するのか分かりますか?

2 つ目の問題は、この文字列を「PCZZTSTR」と呼ばれる恐ろしい MS タイプに変換して、SHFILEOPSTRUCT 構造体で使用できるようにする必要があることです。この変換を行う方法について何か提案はありますか?

4

1 に答える 1

6

path[1]その末尾にある1 要素の配列は、struct可変サイズの構造体を実装するための一般的な C のトリックです。C99 標準より前は、可変サイズの構造体は C 言語で許可されていなかったため、プログラマーはこの方法で実装していました。

パスを格納するバイト シーケンスは、その配列の最初の要素 ( path[0]) から始まりますが、 よりも多くのメモリが構造体に割り当てられるsizeof(MoveObj)ため、配列自体は 1 バイトよりも長くなります。配列の長さが構造体に格納されていない場合は、ゼロで終了していると思います。

PCZZTSTR は恐ろしく聞こえるかもしれませんが、基本的には単純な s の C スタイルの文字列であり、 2TCHAR文字で終了します。P (a へのポインタ)、CZ (C スタイル、ゼロ終了) Z (二重ゼロ終了)、T ( TCHAR )、STR (文字列)。 '\0'

バイトpathをs (古いプラットフォームTCHARでは通常の s であり、最新の Unicode ベースの Windows では s です) に変換し、文字列の末尾にさらに別の文字列を追加すると、.charWCHAR\0PCZZTSTR

于 2012-06-13T07:51:52.923 に答える