【问题标题】:error C2039: “SetDefaultDllDirectories”:is not a member of global namespace错误 C2039:“SetDefaultDllDirectories”:不是全局命名空间的成员
【发布时间】:2013-05-17 22:11:46
【问题描述】:

xxx\vc\atlmfc\include\atlcore.h(638):错误 C2039:“SetDefaultDllDirectories”:不是“全局命名空间”的成员

#ifndef _USING_V110_SDK71_
    // the LOAD_LIBRARY_SEARCH_SYSTEM32 flag for LoadLibraryExW is only supported if the DLL-preload fixes are installed, so
    // use LoadLibraryExW only if SetDefaultDllDirectories is available (only on Win8, or with KB2533623 on Vista and Win7)...
    IFDYNAMICGETCACHEDFUNCTION(L"kernel32.dll", SetDefaultDllDirectories, pfSetDefaultDllDirectories)
    {
        return(::LoadLibraryExW(pszLibrary, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32));
    }
#endif

里面的功能都是VS没有实现的
那么我该如何解决这个问题呢?
libray有什么问题吗?我在VS2012中运行这个程序

【问题讨论】:

    标签: mfc


    【解决方案1】:

    您必须确保在您的项目属性中定义了“_USING_V110_SDK71_”。 Visual Studio 会自动为您定义。它通常不会“显示”,因为未勾选“从父级或项目默认值继承”。

    从旧的 atl 项目升级时,我发现这种情况很常见,因为某些原因,stdafx.cpp 未勾选“从父级或项目默认值继承”。

    您应该检查项目设置以及单个 stdafx.cpp 文件设置,以确定在预处理器定义中选中了“从父级或项目默认值继承”复选框。在某些情况下,会检查项目文件的预处理器定义对话框,但不会检查特定 stdafx.cpp 文件的预处理器定义对话框。

    【讨论】:

    • 如果在项目属性页中自定义了 C/C++ 和资源预处理器定义,请确保它们以 ;%(PreprocessorDefinitions) 结尾。对于从 VS2005 迁移到 VS2010 和现在的 VS2015 的项目,这会导致未定义的 _USING_V110_SDK71_ 符号出现问题 - x86/x64 调试配置缺少此问题,但发布配置没有。
    • “从父级或项目默认值继承”复选框控件是否存在“;%(PreprocessorDefinitions)”。如果您手动添加/删除它,您会发现复选框更改。检查复选框比记住 ";%(PreprocessorDefinitions)" 更容易:)
    • 啊,是的,我明白了。您必须从预处理器定义的下拉列表中选择编辑才能看到。我以为您指的是下拉列表中的“”项,它消除了自定义项。我没有钻得足够深和确定,选中/取消选中该框会导致添加和删除 ;%(PreprocessorDefinitions)。
    【解决方案2】:

    更改包含目录和包含的 SDK 文件夹的顺序对我有用: $(IncludePath);C:\Program Files x86\Microsoft SDKs\Windows\v7.1A\Include

    如果我将文件夹 C:\Program Files %28x86%29\Microsoft SDKs\Windows\v7.1A\Include 放在 $(IncludePath) 之前,我会收到此错误。

    【讨论】:

      【解决方案3】:

      我在 VS 2012 上也遇到了这个问题。

      这是因为您使用的 Windows SDK 7.1 在 VS 2012 (VC11) 中缺少 SetDefaultDllDirectories 函数调用。您可能会注意到有#ifndef _USING_V110_SDK71_ 保护标志以避免使用未定义的SetDefaultDllDirectories

      只需在您的项目中定义_USING_V110_SDK71_,让SDK 知道您在此工具集中或升级到更高版本的SDK。

      【讨论】:

        【解决方案4】:

        我在使用 VS2008 时也遇到过类似的问题,它无法识别功能。我通过将 DDX_Control 添加到 DoDataExchange(CDataExchange* pDX) 来解决它。

        【讨论】:

          【解决方案5】:
          1. 首先将以下几行放在 include 中

            $(VC_IncludePath)
            $(WindowsSDK_IncludePath)

          2. 取消选中“从父级或项目默认值继承”复选框

          【讨论】:

            【解决方案6】:

            我将 _USING_V110_SDK71_ 复制到子分支预处理器/预处理器定义中的 C/C++ 部分,一旦 unchech 从父级继承...并构建项目,然后重新检查此选项并解决问题

            【讨论】:

              【解决方案7】:

              我有同样的问题。这个技巧对我有用。当 Visual Studio 无法正确加载开发环境时,就会出现此问题。无法加载环境变量。所以我试过了,效果很好。

              步骤#1

              启动您正在使用的 Visual Studio 的命令提示符

              步骤 #2 运行这个命令。

              devenv /useenv
              

              此命令将打开 Visual Studio,然后打开您的项目并进行编译。

              【讨论】:

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