Я не был в программировании бюро в то время, но я думаю, что Excel загружает обе версии COMCTL32, так что вам, возможно, придется использовать контекстную активацию API, чтобы направить свой код версии который включает TaskDialog. Некоторые идеи для фиксации проблемы (а не решение как таковые):
Для целей тестирования, сделать временное перечисление всех модулей в активном процессе - просто проверить, если 6,10 фактически загружены (см ниже простой пример такого перечисления, хотя и с другим намерением).
Используйте Activation Context API, чтобы получить нужную версию. Example of use from C# (for enabling themes by way of comctl32 6.0) here.
В качестве альтернативы (я никогда не получил это, чтобы надежно работать в приложении WPF, над которым я работал), создайте класс абстракции диалога, который возвращается к MessageDlg в зависимости от версии, доступной вам. Там могут быть лучшие способы проверки, но ...:
FileVersionInfo version = ProcessUtils.GetLoadedModuleVersion("comctl32.dll");
if (version != null && version.FileMajorPart >= 6 && version.FileMinorPart >= 1)
{
// We can use TaskDialog...
}
else
{
// Use old style MessageBox
}
Перечисление модулей:
internal static FileVersionInfo GetLoadedModuleVersion(string name)
{
Process process = Process.GetCurrentProcess();
foreach (ProcessModule module in process.Modules)
{
if (module.ModuleName.ToLower() == name)
{
return module.FileVersionInfo;
}
return null;
}
}
Вы видели http://stackoverflow.com/questions/719251/unable-to-find-an-entry-point-named-taskdialogindirect-in-dll-comctl32? – ordag
'в простом консольном приложении' является ключом. Это всегда загружает неправильную версию ComCtl32.dll, если вы не предоставите манифест. Приложение Winforms получает это прямо через Application.EnableVisualStyles(), WPF - это iffy. –
Я пробовал те же шаги, что и в http://stackoverflow.com/questions/719251/unable-to-find-an-entry-point-named-taskdialogindirect-in-dll-comctl32, но я получаю то же самое ошибка. –