Приложение VC++ - используйте TaskDialog с резервным вариантом для Windows XP

Я хочу использовать диалог задач в моем приложении VC++. Я могу успешно создать диалоговое окно задачи, используя TaskDialog или TaskDialogIndirect, и оно отлично работает в Vista. Однако я хочу, чтобы мое приложение также работало на Windows XP, и поскольку Windows XP не поддерживает диалог задач, я создал собственный диалог, который я хочу использовать вместо этого в случае, если ОС XP.

Так что мой код выглядит примерно так: если ОС Vista или выше: Show TaskDialog else Показать мой собственный диалог

Теперь приложение по-прежнему не работает в Windows XP. Когда я пытаюсь запустить приложение в XP, я получаю сообщение об ошибке "Не удалось найти порядковый номер 345 в библиотеке динамических ссылок comctl32.dll". Возможно, это связано с тем, что в моем коде есть вызов TaskDialogIndirect, хотя этот вызов находится в блоке if. При загрузке приложения он пытается найти функцию в comctl32.dll и не находит ее, так как это версия DLL для XP.

Итак, мой вопрос:

Как мне кодировать мое приложение, чтобы оно успешно работало как на XP, так и на Vista, и в случае XP показывать мое собственное диалоговое окно, тогда как в случае Vista и выше показывать диалог задачи?

1 ответ

Решение

Проблема в том, что у вашего приложения есть зависимость от этих функций, зависимость, которую загрузчик ОС пытается разрешить при запуске приложения. Но, конечно, эти функции не существуют в XP, поэтому исполняемый файл не загружается.

Есть два способа обойти это. Сначала попробуйте задержать загрузку comctl32.dll. Это должно удалить зависимость от времени загрузки и отложить разрешение до фактического вызова функции. Тогда вам просто нужно позаботиться о том, чтобы не вызывать его там, где это не поддерживается.

Если это не сработает, то вам придется связать с TaskDialog явно, через LoadLibrary а также GetProcAddress, Таким образом, вы никогда не будете явно упоминать функцию так, как ее знает компоновщик, поэтому вы не берете зависимость от времени загрузки. Это немного больше, хотя работа с указателями функций.

Другие вопросы по тегам