c++ - Windows WriteFileGather 函数将最后一个错误设置为 ERROR_INVALID_PARAMETER

标签 c++ windows iocp

重现我的问题的示例代码:

#include <windows.h>
#include <iostream>

int main()
{
  using namespace std;
  HANDLE hdl = CreateFile("test.file", GENERIC_WRITE,
                          FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
                          FILE_ATTRIBUTE_NORMAL  |
                          FILE_FLAG_NO_BUFFERING |
                          FILE_FLAG_OVERLAPPED,
                          NULL);
  char data[4096] = {0};
  DWORD written = 0;

  for(size_t i = 0; i < sizeof(data); ++i)
    data[i] = 'a' + (i % 26);

  OVERLAPPED async_hdl = {0};
  FILE_SEGMENT_ELEMENT segs[3] = {0};

  segs[0].Buffer = PtrToPtr64(data);
  segs[1].Buffer = PtrToPtr64(data);

  if(!WriteFileGather(hdl, segs, 8192, NULL, &async_hdl)) {
    cout << "Last error: " << GetLastError() << endl;
    cout << "overlapped internal status: " << async_hdl.Internal << endl;
    // Last error: 87
    // overlapped internal status: 259
  }
  CloseHandle(hdl);
  return 0;
}

我用 Visual Studio 2012 编译它并在 Windows 7 上测试。作为内联注释,WriteFileGather函数总是将最后一个错误设置为 ERROR_INVALID_PARAMETER (87) 和 Internal OVERLAPPED 结构的字段是 259 .

我错过了什么?

最佳答案

MSDN:aSegmentArray ...系统内存页面并且必须在系统内存页面大小边界上对齐。使用 _aligned_malloc() 而不是堆栈内存。

关于c++ - Windows WriteFileGather 函数将最后一个错误设置为 ERROR_INVALID_PARAMETER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29413750/

相关文章:

c++ - 如何在需要时将C++中的计算推迟?

windows - 如何在 Windows RT 中以波形格式录制来自麦克风的声音?

node.js - UDP 多播失败 - NodeJS/Windows 10

c# - 具有异步 UDP 操作的 .NET IOCP 线程池开销

c - 是否订购了带 IOCP 的 WSASend?

c++ - 使用嵌套的 if 语句来构造代码

c++ - 将 std::pair 的 const 引用传递给函数

C++ 析构函数返回类型

c++ - IOCP,跨平台库?

c# - 如果字符串包含整数,如何为文本框设置条件