【问题标题】:InitializeCriticalSectionEx is not member of global namespace in atlwinverapi.hInitializeCriticalSectionEx 不是 atlwinverapi.h 中全局命名空间的成员
【发布时间】:2018-04-19 15:39:43
【问题描述】:

我最近从 vs 2013 转到 vs 2017。我们有这个项目,其中包含以下预处理器定义:

WIN32
DRG_BUILD_DLL
WINVER=0x0600

现在在atlwinverapi.h 中,我收到InitializeCriticalSectionEx 不是全局命名空间成员的错误。任何想法为什么会发生这个问题?

#if (NTDDI_VERSION >= NTDDI_VISTA) && !defined(_USING_V110_SDK71_) && !defined(_ATL_XP_TARGETING)
    // InitializeCriticalSectionEx is available in Vista or later, desktop or store apps
    return ::InitializeCriticalSectionEx(lpCriticalSection, dwSpinCount, Flags);

【问题讨论】:

  • 如果增加WINVER定义并重建会发生什么?见Modifying WINVER and _WIN32_WINNT。还要确保在"atlwinverapi.h" 之前包含"Windows.h",如下所述:InitializeCriticalSectionEx function
  • @PhilBrubaker 增加WINVER 没有帮助。我已经试过了。我只有atlwinverapi.h 作为外部依赖项,所以我不直接包括在内。我检查了atlevent.h 并没有包含windows.h
  • 我看到"atlwinverapi.h" 确实包含"Windows.h"。我怀疑在某处有另一个"WINVER" 定义阻止InitializeCriticalSectionEx() 函数作为声明公开。
  • 您可以使用 Proprocess 到文件功能解决该场景。见这里:-P Preprocess to a File
  • @PhilBrubaker 感谢您的提示,如果解决了会尝试并报告。

标签: c++ sdk visual-studio-2017 atl preprocessor


【解决方案1】:

我也遇到了这个错误,因为包含了一个标头(为 MSVC12 编写)

#define _WIN32_WINNT 0x502 //NTDDI_VERSION

解决方法是删除这一行。

这修复了它,因为 C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\um\synchapi.h 包含

#if (_WIN32_WINNT >= 0x0600)
    InitializeCriticalSectionEx(
        _Out_ LPCRITICAL_SECTION lpCriticalSection,
        _In_ DWORD dwSpinCount,
        _In_ DWORD Flags
    );
#endif // (_WIN32_WINNT >= 0x0600)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    相关资源
    最近更新 更多