C++ 使用自由函数作为LPOVELAPPED_完成_例程

C++ 使用自由函数作为LPOVELAPPED_完成_例程,c++,winapi,C++,Winapi,我无法理解以下编译错误: unsigned char buf[1000]; const DWORD maxBytes = 1000; OVERLAPPED o; void foo(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped) { return; } void bar(HANDLE hFile) { auto lambda_foo = [](DWORD dwErrorCode

我无法理解以下编译错误:

unsigned char buf[1000];
const DWORD maxBytes = 1000;
OVERLAPPED o;

void foo(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped) {
  return;
}

void bar(HANDLE hFile) {
  auto lambda_foo = [](DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped){return;};
  ReadFileEx(hFile, buf, 1000, &o, lambdafoo); //compiles
  ReadFileEx(hFile, buf, 1000, &o, foo); //doesn't compile
}
错误是“无法将参数5从'void(uu cdecl*)DWORD,DWORD,LPOVERLAPPED'转换为'LPOVERLAPPED'完成程序'”。我使用MSVC2015


谁能告诉我我做错了什么?为什么它使用lambda编译,而不是使用相同的自由函数

windows中的回调对调用约定有特殊要求。Windows提供了一个名为
CALLBACK
的方便宏,用于在定义函数时指定调用约定

void CALLBACK foo(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped)
{
  return;
}

windows中的回调对调用约定有特殊要求。Windows提供了一个名为
CALLBACK
的方便宏,用于在定义函数时指定调用约定

void CALLBACK foo(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped)
{
  return;
}