VC ++应用程序 - 使用TaskDialog和Windows XP的后备

时间:2013-10-15 10:11:47

标签: visual-c++ windows-xp taskdialog

我想在VC ++应用程序中使用任务对话框。我能够使用TaskDialog或TaskDialogIndirect成功创建任务对话框,它在Vista中运行正常。但是,我希望我的应用程序也可以在Windows XP上运行,并且由于Windows XP不支持任务对话,我已经创建了一个我想要使用的对话框,以防操作系统是XP。

所以我的代码做了类似的事情: 如果操作系统是Vista或更高版本:     显示TaskDialog 其他     显示我自己的对话框

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

所以我的问题是:

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

1 个答案:

答案 0 :(得分:1)

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

有两种解决方法。首先,尝试delay-loading comctl32.dll。这应该删除加载时依赖性并延迟分辨率,直到实际调用该函数。那么你只需要注意不要在不受支持的地方调用它。

如果这不起作用,那么您必须通过TaskDialogLoadLibrary明确绑定到GetProcAddress。这样,您从未以链接器知道的方式明确提及该函数,因此您不会对其执行加载时依赖性。虽然这有点工作,但是使用函数指针。