安装 Visual Studio 2010 后出现错误 C1189

Posted

技术标签:

【中文标题】安装 Visual Studio 2010 后出现错误 C1189【英文标题】:error C1189 after installing Visual Studio 2010 【发布时间】:2011-04-30 03:31:48 【问题描述】:

我在驱动器崩溃后安装了 VS2010,之前我有 VS2005,一切都很好。

现在在编译一个以前很好的 C++ 应用程序时,我看到了一些我无法弄清楚的错误。

错误 1 ​​错误 C1189: #error : 此文件要求 _WIN32_WINNT 至少 #defined 到 0x0403。建议使用 0x0501 或更高的值。 C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\atlcore.h 35 1 BIOXGINA

#ifndef __ATLCORE_H__
#define __ATLCORE_H__

#pragma once

#ifdef _ATL_ALL_WARNINGS
#pragma warning( push )
#endif

#pragma warning(disable: 4786) // identifier was truncated in the debug information
#pragma warning(disable: 4127) // constant expression

#include <atldef.h>
#include <windows.h>
#include <ole2.h>

#include <limits.h>
#include <tchar.h>
#include <mbstring.h>

#include <atlchecked.h>
#include <atlsimpcoll.h>

34.  #if _WIN32_WINNT < 0x0403
35.  #error This file requires _WIN32_WINNT to be #defined at least to 0x0403. Value 0x0501 or higher is recommended.
36.  #endif

#pragma pack(push,_ATL_PACKING)
namespace ATL

/////////////////////////////////////////////////////////////////////////////
// Verify that a null-terminated string points to valid memory
inline BOOL AtlIsValidString(
_In_z_count_(nMaxLength) LPCWSTR psz,
_In_ size_t nMaxLength = INT_MAX)

(nMaxLength);
return (psz != NULL);

如果我注释掉上面的行,我就会得到

错误 C3861 在下面的第 111 行找不到标识符。

我想我只是因为我评论了上述几行而得到了这个?

HRESULT Init() throw()

    HRESULT hRes = S_OK;

111.        if (!InitializeCriticalSectionAndSpinCount(&m_sec, 0))
    
        hRes = HRESULT_FROM_WIN32(GetLastError());
    

    return hRes;

我将不胜感激这方面的任何帮助。不想重装2005。

【问题讨论】:

【参考方案1】:

这个Microsoft Connect issue 有这个潜在的解决方案:

编辑文件“stdafx.h”并将为_WIN32_WINNT和WINVER定义的值更改为0x0502。

更多关于这个error on the MSDN C++ forum: Problem with older VC Solution的讨论。

【讨论】:

我没有更改系统文件 stdafx.h,而是选择在我的项目的预处理器定义中设置这些。比修改系统 .h 文件更便携。 @PeteMagsig:stdafx.h 不是系统文件。它是由 New Project 向导自动放入您的项目中的代码,作为预编译头文件的焦点,但它根本不与其他任何东西共享。 (文件名很糟糕) @BenVoigt:感谢您指出这一点。我没有意识到这就是 stdafx.h 的来源。我仍然赞成在编译器配置中使用预处理器定义。 @Pete:我通常使用规则“此设置是否适用于所有构建配置、发布、调试、32 位、64 位等?”由于我不为不同的 Windows 版本构建单独的二进制文件,因此我不希望它成为构建配置。如果你测试了 WINVER 并在你自己的代码中进行了条件编译,那么这将是一个配置设置。【参考方案2】:

您的项目针对的是新编译器(或其他任何东西)不再支持的 Windows 版本。

您必须选择 Windows XP(“Windows 5”)或更高版本的最低目标版本。

【讨论】:

编译器并不关心,它是与旧 Windows 版本存在问题的库。 C 运行时库有几个基本功能,它们依赖于 WinXP 功能来完成非基本任务,因此很难取消。但这个特殊问题是 ATL 对 XP 中引入的函数的依赖。【参考方案3】:

感谢两位的回复。

我设法摆脱了错误消息,如下所示。 Context.h 看起来像这样。

  #pragma once

  #define _WIN32_WINNT 0x0400

  #include <windows.h>
  #include <winwlx.h>
  #include <ObjBase.h>
  #include <comdef.h>
  #include <atlbase.h>

  extern CComModule _Module;

  #include <atlcom.h>
  #include <vector>

我将#define _WIN32_WINNT 0x0400 移动到所有包含后结束,它编译好了。奇怪,但它奏效了。

不过,我会按照建议将其更改为 0x0502。

谢谢

【讨论】:

【参考方案4】:

项目属性 -> 配置属性 -> C/C++ -> 命令行 -> 附加选项 :添加此代码

/D“_WIN32_WINNT=0×0501”

如果在Windows server 2003中,0×0501变为0×0502; 如果在 Windows 7 中, 0×0501 变为 0×0601

效果很好

【讨论】:

以上是关于安装 Visual Studio 2010 后出现错误 C1189的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Visual Studio2010运行C语言

安装Visual Studio出现如图问题怎么解决

电脑里的visual studio 2010怎么打开

visual studio 2010 简体中文版编程软件怎么安装

visual studio C++2010 系统找不到指定文件”

安装 Visual Studio 2010 SP1 后有没有办法释放空间