1

我想在我的 VC++ 应用程序中使用任务对话框。我可以使用 TaskDialog 或 TaskDialogIndirect 成功创建任务对话框,并且在 Vista 中运行良好。但是,我希望我的应用程序也可以在 Windows XP 上运行,并且由于 Windows XP 不支持任务对话框,因此我创建了一个我自己的对话框,我想在操作系统是 XP 的情况下使用它。

所以我的代码是这样的:如果操作系统是 Vista 或更高版本: Show TaskDialog else Show my own dialog

现在该应用程序仍然无法在 Windows XP 中运行。当我尝试在 XP 上启动应用程序时,我收到错误“无法在动态链接库 comctl32.dll 中找到序号 345”。这可能是因为对 TaskDialogIndirect 的调用存在于我的代码中,尽管该调用位于 if 块中。在加载应用程序时,它会尝试在 comctl32.dll 中找到该函数,但由于它是 XP 版本的 dll,因此没有找到它。

所以我的问题是:

如何对我的应用程序进行编码以使其在 XP 和 Vista 上成功运行,并且在 XP 的情况下显示我自己的对话框,而在 Vista 和更高版本的情况下显示任务对话框?

4

1 回答 1

1

问题是您的应用程序依赖于这些函数,操作系统加载程序试图在应用程序启动时解决这种依赖关系。但当然,这些功能在 XP 中不存在,因此无法加载可执行文件。

有两种方法可以解决这个问题。首先,尝试延迟加载comctl32.dll。这应该消除加载时间依赖性并延迟解决,直到实际调用该函数。然后你只需要注意不要在不支持的地方调用它。

如果这不起作用,那么您将不得不TaskDialog显式绑定到 viaLoadLibraryGetProcAddress. 这样,您永远不会以链接器知道的方式明确提及该函数,因此您不会对它产生加载时依赖。不过,这需要更多的工作,使用函数指针。

于 2013-10-15T13:21:24.157 回答