无法在kernel32.dll中找到GetOverlappedResultEx

时间:2015-11-25 16:46:47

标签: c++ visual-studio-2012 dll kernel named-pipes

当我开始使用此函数GetOverlappedResultEx时,我正在尝试创建一个使用dll进行管道通信的应用程序并遇到此错误。每当我运行使用我的dll的可执行文件时,我都会收到此错误消息...有谁知道它的含义是什么?我正在构建64位dll!我在visual studio 2012上使用C ++。我是否需要安装任何服务包? 编辑:我正在使用Windows 7计算机

enter image description here

2 个答案:

答案 0 :(得分:3)

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

要弄清楚发生了什么,请在MSDN中搜索该功能。在该页面上,您可以看到GetOverlappedResultEx确实应该来自kernel32.dll,但它在Windows 8之前未添加到API中。您可能尝试在较旧版本上运行该程序版本的Windows。

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

答案 1 :(得分:1)

如果您将Windows 7作为最低目标,则应将_WIN32_WINNT设置为0x0601作为预处理器定义。 Windows 8 SDK或更高版本默认使用最新版本的'而不是最古老的'设置此主要标头控件,其中VS 2012为0x0602(Windows 8)。许多API标头依赖此定义来控制特定于平台的行为,以支持“低级别”。 OS的版本。请参阅Using Windows Headers

仅在Windows 8或更高版本上支持

GetOverlappedResultEx。如果您想与Windows 7兼容,那么您需要坚持使用GetOverlappedResult

对于Windows 8商店,Windows Phone 8和通用Windows应用,您需要使用GetOverlappedResultEx。因此,如果您正在编写正在为这两个平台重用的代码,请返回我们的朋友_WIN32_WINNT。例如,在DirectX Tool Kit中的WaveBankReader.cpp中,我使用以下内容来支持适用于Windows桌面,Windows 8商店,Windows Phone 8和通用Windows应用的Windows Vista或更高版本:

#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
  

我在"低级"中明确调用了WaitForSingleObject。基于如果先前的ReadFile失败并且ERROR_IO_PENDING失败而设置的变量的案例。 GetOverlappedResultEx处理此案例。

请参阅Dual-use Coding Techniques