What options do I have to build a WTL program that runs on XP and later but with latest features?
默认情况下,WTL使用定义根据WINVER等使功能可用,就像windows.h和其他Windows SDK标头一样。
这意味着现代的WTL应用程序在链接时只能在XP和更高版本上运行,但仅使用XP可用的功能。如果包含较新平台的功能,则最终会产生与XP不兼容的二进制文件。
是否有一种构建WTL应用程序的方式,使得它在新系统上仍具有可以在XP上运行的现代外观(现代通用控件和通用对话框)?我该怎么办?
无法在XP和XP之前的系统中运行是由于使用最新的Visual C工具集,而不是使用最新的WINVER值。据我所知,最后一个与Windows 2000兼容的C运行时是Visual Studio 2008的" v90 \\" –这是您需要使用的(或者使用非MS编译器?)。对于XP,您需要其中一个工具集:v100,v110_xp,v120_xp。请注意,后缀" _xp"表示这是另一个主流工具集的替代版本,但是与XP不兼容。
也就是说,要定位XP和更高版本,您需要适当的工具集,然后是Visual Studio的版本,是否包含最新的WINVER都无关紧要。
当前版本的WTL和Visual Studio 2008至2013,其中应用了适当的工具集,可构建有效的XP兼容应用程序,同时可能包含最新的SDK定义,并通过高WINVER值将其解锁。
以这种方式构建的应用程序与OS版本兼容,因为它们没有指向可能丢失的依赖项的静态链接。另一种方法是,您可以检测运行时环境中是否有特定功能。例如,如果您要使用需要Common Controls版本6的功能,而XP中缺少这些功能,则您有责任检查可用功能并退回到代码中的相应代码路径。
- 人们也可以使用WDK,而不仅仅是SDK或VS。不过,这不是我要问的重点。重要的一点不是我的构建应该在一个方向上兼容,而是应该在两个方向上兼容。不过,我不确定我应该如何在问题中使用不同的措词以使其清楚。例如,基本上使用VS 2005构建它并不会自动解决WTL问题,该问题只允许使用单个WINVER,并且如果给定值指定Vista或7,则在XP上以不兼容的方式运行。CRT当然也可以相关,但这超出了我的问题范围。
-
抱歉,我看到您想要XP,而不是XP之前的版本,我更新了答案。
-
感谢您的宝贵时间,但这仍然可以避免我的实际问题。我的问题不仅仅在于能够在XP中运行应用程序。我知道我可以做到,而且我知道如何做到这一点。事实是某些#define将支配编译器完全看到的符号(在较小程度上是WTL的行为)。因此,如果将WINVER设置为0x600,我可能会获得所需的现代功能,但它甚至无法在XP上加载。如果将WINVER设置为0x501,则它将在XP上运行,但在更现代的Windows版本上看起来会很糟糕。我想这都是我的问题-尽管用更少的字眼。
-
好吧,这里的经验法则如下:该运行时的1 _xp工具集与最旧的OS版本,2最高的WINVER和朋友值完全兼容,以解锁最新的SDK定义,最后是3运行时检测(您的责任)具有适当的UI / API更改和后备功能的更新功能,这些功能在较新的操作系统中可用,但在较新的OS中不可用。
-
后者的示例:如果版本为Vista,则可以使用较新的通用对话框API来打开/保存文件对话框。否则,您仅限于GetOpenFileName。但是,要首先获得新的API定义,您必须将WINVER定义得足够高...
-
嗯,最后一段现在触及了我的问题的主题。您写的是我写的评论。是的,您给出的Vista示例正是我面临的问题,我想知道如何解决该问题,而无需手动声明较低WINVER不可用的所有功能(以及WTL模板和其他符号) 。
-
高WINVER值会打开新的定义,但在您开始在代码中实际使用(引用)它们之前,它们不会破坏与旧系统的兼容性。这是您一个人的地方,WTL本身并没有什么帮助。如果您使用一些新的东西破坏了与旧系统的兼容性,则您有责任使用动态链接或延迟加载的DLL,否则应解决这些冲突。
-
好的,因此,除了我自己管理所有这些并重新发明之前必须已经发明了数十亿次的轮子之外,没有别的选择了吗?那是你的意思吗
-
如果没有Y,则没有万能的轮子可以回退到X。您可以从中获得帮助:延迟加载DLL,WTL atlapp.h中的RunTimeHelper类,版本检查功能。仅此而已(延迟加载的DLL实际上非常有帮助)。
-
谢谢,在这种情况下,我将接受您的回答。尽管这意味着我是我的起点,但也意味着我现在知道我并没有错过可能存在的更好,更轻松的事情。
-
问题在于,只有开发人员才能决定在缺少API的情况下该怎么做。通常使用2条代码路径将其package到helper类中-正常和兼容性回退,但是每种情况下都没有package器。然后-是的-我们就是从这里开始的。
-
考虑ITaskbarList3。 COM接口查询它们并忽略它们是否不返回实例(条件代码路径)没什么大不了的。但是,如果没有将WINVER至少设置为W7,我什至不会看到GUID或接口声明。这是一个愚蠢的情况。与API声明类似,您不仅会错过函数原型,还会错过与调用该函数相关的常量。使用延迟加载或类似技术只能解决其中的一部分。