C++ 在kernel32.dll中找不到GetOverlappedResultEx

C++ 在kernel32.dll中找不到GetOverlappedResultEx,c++,visual-studio-2012,dll,kernel,named-pipes,C++,Visual Studio 2012,Dll,Kernel,Named Pipes,我试图创建一个使用dll进行管道通信的应用程序,但在开始使用此函数时遇到了此错误GetOverlappedResultEx。每当我运行使用dll的可执行文件时,我都会收到此错误消息…有人知道它的含义吗?我正在构建64位DLL!我在Visual Studio 2012上使用C++。我需要安装任何service pack吗? 编辑:我正在使用Windows7计算机 该消息意味着代码的某些部分依赖于GetOverlappedResultEx,该函数预期存在于系统DLL kernel32.DLL中。(k

我试图创建一个使用dll进行管道通信的应用程序,但在开始使用此函数时遇到了此错误
GetOverlappedResultEx
。每当我运行使用dll的可执行文件时,我都会收到此错误消息…有人知道它的含义吗?我正在构建64位DLL!我在Visual Studio 2012上使用C++。我需要安装任何service pack吗? 编辑:我正在使用Windows7计算机


该消息意味着代码的某些部分依赖于GetOverlappedResultEx,该函数预期存在于系统DLL kernel32.DLL中。(kernel32.dll中的32表示Windows API的32位版本,即使对于64位程序也是如此。)

要了解发生了什么,请在MSDN中搜索函数。在该页面上,您可以看到它确实应该来自kernel32.dll,但在Windows8之前它并没有添加到API中。您可能试图在旧版本的Windows上运行该程序


您可以选择在较新版本的Windows上运行该程序,或修改代码使其不依赖于此特定功能。

如果您的目标是Windows 7作为最小值,则应将
\u WIN32\u WINNT
设置为
0x0601
,作为预处理器定义。Windows 8 SDK或更高版本默认为此主标头控件的“最新”设置,而不是“最旧”设置,VS 2012为
0x0602
(Windows 8)。许多API头依赖于此定义来控制特定于平台的行为,以支持操作系统的“底层”版本。看

GetOverlappedResultEx
仅在Windows 8或更高版本上受支持。如果希望与Windows 7兼容,则需要坚持使用
GetOverlappedResult

对于Windows 8应用商店、Windows phone 8和通用Windows应用,您需要使用
GetOverlappedResultEx
。因此,如果您编写的代码在这两个平台上都被重用,那么您可以回到我们的朋友
\u WIN32\u WINNT
。例如,在中的
WaveBankReader.cpp
中,我使用以下内容来支持Windows Vista或更高版本的Windows桌面、Windows 8应用商店、Windows phone 8和通用Windows应用程序:

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
    BOOL result = GetOverlappedResultEx( hFile.get(), &request, &bytes, INFINITE, FALSE );
#else
    if ( wait  )
        (void)WaitForSingleObject( m_event.get(), INFINITE );

    BOOL result = GetOverlappedResult( hFile.get(), &request, &bytes, FALSE );
#endif
如果先前的
读取文件
失败并出现
错误_IO _PENDING
时设置了一个变量,则在“向下”情况下,我可以显式调用
WaitForSingleObject
GetOverlappedResultEx
处理此情况


请参见

您在哪个平台上运行应用程序?与您对service pack的评论非常相似:它不会解决此特定问题,但值得注意的是,VS 2012、VS 2013和VS 2015的目标是Windows 7 service pack 1,而不是Windows 7 RTM。使用VS 2015,C++ ReDIST包将无法安装在Windows 7 RTM上。Windows 7 RTM已过期,因此Windows 7 Service Pack 1是必需的。