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