GetOverlappedResultEx 无法位于 kernel32.dll

GetOverlappedResultEx could not be located in kernel32.dll

我正在尝试创建一个使用 dll 进行管道通信的应用程序,当我开始使用此功能时 运行 出现此错误 GetOverlappedResultEx。每当我 运行 使用我的 dll 的可执行文件时,我都会收到此错误消息...有人知道它的含义吗?我正在构建 64 位 dll!我在 visual studio 2012 上使用 C++。我需要安装任何服务包吗? 编辑:我正在使用 Windows 7 电脑

该消息表示部分代码依赖于 GetOverlappedResultEx,系统 DLL 中存在它期望的函数 kernel32.dll。 (kernel32.dll中的32是指WindowsAPI的32位版本,即使是64位程序也是如此。)

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

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

如果您将 Windows 7 作为最低目标,那么您应该将 _WIN32_WINNT 设置为 0x0601 作为预处理器定义。 Windows 8 SDK 或更高版本默认为 'newest' 而不是此主要 header 控件的 'oldest' 设置,VS 2012 为 0x0602(Windows 8).许多 API header 依赖此定义来控制 platform-specific 行为以支持 OS 的 'down-level' 版本。参见 Using Windows Headers

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

对于 Windows 8 Store、Windows phone 8 和通用 Windows 应用,您需要使用 GetOverlappedResultEx。因此,如果您正在编写可在这两个平台上重复使用的代码,请回到我们的朋友 _WIN32_WINNT 那里。例如,在 DirectX Tool Kit 中的 WaveBankReader.cpp 我使用以下支持 Windows Vista 或更高版本的 Windows 桌面,Windows 8 Store,Windows phone8个,通用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

I have the explicit call to WaitForSingleObject in the "down-level" case based on a variable that is set if the previous ReadFile failed with an ERROR_IO_PENDING. GetOverlappedResultEx handles this case.

Dual-use Coding Techniques