使用Windows 8 SDK编译Windows 7

(这个问题以zlib为例,但不是特定的.)

我正在尝试使用它附带的MSVC项目文件在Windows上编译zlib.我正在使用VS2012和Windows 8 SDK,但我的构建机器是Windows 7.

Zlib包含以下代码

#ifdef IOWIN32_USING_WINRT_API
    if ((filename!=NULL) && (dwDesiredAccess != 0))
        hFile = CreateFile2((LPCTSTR)filename,dwDesiredAccess,dwShareMode,dwCreationDisposition,NULL);
#else
    if ((filename!=NULL) && (dwDesiredAccess != 0))
        hFile = CreateFile((LPCTSTR)filename,NULL,dwFlagsAndAttributes,NULL);
#endif

其中IOWIN32_USING_WINRT_API设置如下

#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
#define IOWIN32_USING_WINRT_API 1
#endif
#endif

WINAPI_FAMILY_PARTITION和WINAPI_PARTITION_APP在Windows 8 SDK(winapifamily.h)中定义,因此结果是可以编译在zlib中使用CreateFile2的代码.

我可以编译zlib,但是任何尝试加载它的应用程序都会失败,因为它找不到CreateFile2,这是正确的,因为我的机器是Windows 7并且该API是在Windows 8中引入的.

这是我第一次在较低版本的Windows上使用Windows SDK而不是它支持,因此我的问题是:

我唯一可以使用补丁zlib来检查_WIN32_WINNT> = _WIN32_WINNT_WIN8到第一行,并将/ D_WIN32_WINNT = _WIN32_WINNT_WIN7传递给msbuild?这意味着我必须构建两组二进制文件 – 一组支持Win7(通过传递/ D)和一组支持Win8(不传递/ D).

是否没有办法在Windows 7和8上运行兼容的公共二进制文件,如果在Windows 8上运行,则使用CreateFile2代码路径? (我想这种方式是GetProcAddress函数指针.还有别的吗?)

您可以使用_WIN32_WINNT选择要定位的操作系统版本.这是破解的zlib检查. WINAPI_FAMILY_DESKTOP_APP包含WINAPI_FAMILY_APP,因此它们的检查总是成功.您可以修复它:
#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY_DESKTOP_APP,WINAPI_PARTITION_APP)
#define IOWIN32_USING_WINRT_API 1
#endif
#endif

有关详细信息,请参阅此处:http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/3965645c-978c-4148-b32c-1853f7fd22b3

相关文章

(1)when you ping a computer from itsafe,the ping command should return the local IP address. (...
1、点击win菜单,点击设置图标 2、选择系统选项 3、选择应用与程序选项 4、拉到最下方,选择程序与功能...
目前一直直接往Windows 2008 R2 Server中复制文件(暂时还没有搭建ftp服务),突然不能复制了,于是百度...
windows下使用vscode配合xebug调试php脚本 要下载有php_xebug.dll扩展的版本,最新版可能没有这个扩展,p...
在控制面板的程序与功能里启用和关闭windows功能打开,适用于linux的windows子系统
效果演示 推荐一个非常牛的文档网站生成器:docsify 我通过这个工具,成功将码云上的个人学习笔记发布到...