2

我正在尝试将 A 驱动器的内容复制到文件夹 C:\test\disk1 中。文件夹 disk1 已存在。程序编译但运行时出现错误 87。我知道错误 87 与无效参数有关,但我不确定问题出在哪里。有人有什么想法吗?

#include <Windows.h>
#include <stdio.h>

int main(int argc, char ** argv)
{
    const wchar_t *const sourceFile = L"A:\\";
    const wchar_t *const outputFile = L"C:\\test\\disk1";

    SHFILEOPSTRUCTW fileOperation;
    memset(&fileOperation, 0, sizeof(SHFILEOPSTRUCTW));

    fileOperation.wFunc = FO_COPY;
    fileOperation.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR |
                               FOF_NOERRORUI | FOF_FILESONLY;
    fileOperation.pFrom = sourceFile;
    fileOperation.pTo = outputFile;

    int result = SHFileOperationW(&fileOperation);
    if (result != 0)
    {
        printf("SHFileOperation Failure: Error%u\n", result);
        return 1;
    }

    memset(&fileOperation, 0, sizeof(SHFILEOPSTRUCTW));

    printf("OK\n");
    return 0;
}
4

1 回答 1

3

请注意SHFILEOPSTRUCT的文档,尤其是pFromand的文档pTo

  PCZZTSTR     pFrom;
  PCZZTSTR     pTo;

是什么PCZZTSTR意思?

pFrom
Type: PCZZTSTR
Note  This string must be double-null terminated.

所以你的解决办法是提供一个额外的尾随零。

const wchar_t *const sourceFile = L"A:\\\0";
const wchar_t *const outputFile = L"C:\\test\\disk1\0";

请注意,Windows API 函数接受/作为目录分隔符,因此可以写成更容易阅读:

const wchar_t *const sourceFile = L"A:/\0";
const wchar_t *const outputFile = L"C:/test/disk1\0";

PCZZSTR实际上是一个指向以空字符串结尾的零终止字符串列表的指针。)

于 2017-03-02T12:26:00.183 回答