2012-01-21 5 views
1

Я стараюсь использовать Vista TaskDialog Wrapper and Emulator и я получаю следующее исключение:Виста TaskDialog Wrapper: Не удается найти точку входа с именем «TaskDialogIndirect» в DLL «COMCTL32»

«Не удается найти точку входа с именем 'TaskDialogIndirect' в DLL 'ComCtl32'. "

... в простом приложении консоли:

Что я делаю неправильно?

UPDATE:

На самом деле, я работаю на плагин Excel с использованием Excel-ДНК. Как я могу контролировать загрузку dll Excel?

http://exceldna.codeplex.com/discussions/286990#post728888

+1

Вы видели http://stackoverflow.com/questions/719251/unable-to-find-an-entry-point-named-taskdialogindirect-in-dll-comctl32? – ordag

+3

'в простом консольном приложении' является ключом. Это всегда загружает неправильную версию ComCtl32.dll, если вы не предоставите манифест. Приложение Winforms получает это прямо через Application.EnableVisualStyles(), WPF - это iffy. –

+0

Я пробовал те же шаги, что и в http://stackoverflow.com/questions/719251/unable-to-find-an-entry-point-named-taskdialogindirect-in-dll-comctl32, но я получаю то же самое ошибка. –

ответ

1

Я не был в программировании бюро в то время, но я думаю, что 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; 
    } 
} 
-1

В дополнение к тому, что все остальные говорят: эта ошибка будет исчезните, если вы установили ForceEmulationMode на PSTaskDialog на true.

+0

Это обходное решение на самом деле не устраняет проблему, просто обходя ее. –

+0

Да - это обходное решение. Он фиксирует симптом, не устраняя причину. На самом деле я не считаю это поводом для нисходящего потока. Однако, как и в большинстве случаев, OP не сможет загрузить свою версию нужной версии DLL, используя 'ForceEmulationMode', все равно позволит ему использовать' PSTaskDialog', не получив ошибку. –

Смежные вопросы