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.
我正在尝试创建一个使用 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 previousReadFile
failed with anERROR_IO_PENDING
.GetOverlappedResultEx
handles this case.