error C2065: “LOAD_LIBRARY_SEARCH_SYSTEM32”

VS2010切换至110_xp后编译报错 error C2065: “LOAD_LIBRARY_SEARCH_SYSTEM32”

最近使用vs2012(打补丁到Update5)开发基于ATL的项目出现了这个编译错误。而且只有一条,到网上搜索了半天也没有真正说明问题,只有自己来了。找到相关报错如下:

1>------ Build started: Project: Win32Project1, Configuration: Debug Win32 ------
1>  stdafx.cpp
1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\atlcore.h(632): error C2065: 'LOAD_LIBRARY_SEARCH_SYSTEM32' : undeclared identifier
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

对应的代码如下:

inline HMODULE AtlLoadSystemLibraryUsingFullPath(_In_z_ const WCHAR *pszLibrary)
{
#if (NTDDI_VERSION >= NTDDI_WIN8)
    return(::LoadLibraryExW(pszLibrary, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32));
#else
    WCHAR wszLoadPath[MAX_PATH+1];
    if (::GetSystemDirectoryW(wszLoadPath, _countof(wszLoadPath)) == 0)
    {
        return NULL;
    ... 后面的就省略了
#endif

关键可以看到 NTDDI_VERSION >= NTDDI_WIN8 这个表达式,既然选择了编译到 WINXP 这个表达式如何也不可能成立呀。

逐一打印 发现 NTDDI_VERSION,和 NTDDI_WIN8, 居然 NTDDI_WIN8 是空。此时再分析一下,就找到问题了:
- 使用Platform Tool 为 110_xp 时指向C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A
- 使用Platform Tool 为 110 的时候 C:\Program Files (x86)\Windows Kits\8.0
- 而 NTDDI_WIN8 在 v7.1A 版本中 没有定义,只定义到 NTDDI_WIN7。
接下来就好办了问题原因找到了,那么自然就好办了。
方法一:
在 stdafx.h 中在调用 atlbase.h 之前,加入对 NTDDI_WIN8 的定义。

#ifndef NTDDI_WIN8
#define NTDDI_WIN8       0x06020000
#endif 

方法二:
直接修改 v7.1A 的版本的 SDKDDKVer.h line 131

#define NTDDI_WIN8 0x06020000

整个问题其实很简单,但是遇到问题就百度的习惯,让自己先绕了远路,留下这篇来提醒一下自己吧。


有价值的参考不多:
http://www.vcerror.com/?p=1101

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值