1

假设我在 VC++ 环境中有一个程序。该程序需要修改自身才能将某些代码用于不同的操作系统。

例如,假设程序将修改代码为 do和 forA它将修改代码为 do 。位于文件上的操作代码和位于文件上的操作代码。Windows XPWindows 7BA"a.h"B"b.h"

假设我有一个功能,其目的是检测操作系统。如果我希望通过检测操作系统仅加载其中一个文件,如何通过激活功能等术语包含文件?

4

3 回答 3

3

你不能做你暴露它的事情。

#include机制由预编译器处理,它在编译时运行,而不是在运行时运行,因此,一旦你的二进制文件被编译,所有的预编译器选择都已经做出并进入最终的可执行文件。

要根据 Windows 的版本做不同的事情,您必须包含两种行为的代码并在运行时选择正确的行为,例如使用GetVersionExAPI 的结果。

于 2012-12-31T14:38:28.800 回答
2

您暗示您希望使用预处理器有条件地构建不同的可执行文件,而不是影响运行时行为。这样做的结果是您将拥有每个不同操作系统的可执行文件。这可能是也可能不是你想要的,并带来了它自己的陷阱。

一般来说,避免条件编译是值得的,除非你的代码根本不会在任何其他环境上构建。可能更好的解决方案是在运行时派生特定功能。这可以通过检测操作系统或配置等来完成。

您可能需要考虑一些专门在运行时动态加载库的方法。您可以使用dlopenLinux 上的函数族来执行此操作(不确定 Windows,但我确信有类似的东西。)一个缺点是几乎没有检查方法,因此如果您弄错界面,请期待 seg故障。此外,接口仅限于 C 链接。

于 2012-12-31T15:15:17.007 回答
1

是的,因此完全有可能创建在现代和旧版本的 Windows 上运行的可执行文件。执行此操作的典型方法是检查实际版本,然后更改代码。MS在这里告诉你如何检查版本:

http://msdn.microsoft.com/en-gb/library/windows/desktop/ms724429(v=vs.85).aspx

然后你只需做一个标志,说它bool isWndowsXP是由检查代码设置的,并且在相关的地方做if(isWindowsXP) do_stuff_xp_way(); else do_stuff_otherway();

如果您需要更具体的建议,您确实需要提供隐藏在问题中 A 和 B 后面的功能。

于 2012-12-31T15:23:25.703 回答