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