2009-04-05 3 views
5

У нас есть конкретный компьютер Vista x64, что, при запуске нашего C# WinForms приложение, отображающее следующее сообщение об ошибке:Не удается найти точку входа с именем «TaskDialogIndirect» в DLL «COMCTL32»

System.EntryPointNotFoundException: Unable to find an entry point named 'TaskDialogIndirect' in DLL 'ComCtl32'.

Этот же код работает отлично работает на других машинах Vista. По какой-то причине эта конкретная машина Vista всегда выбрасывает это исключение.

Как мы можем исправить это?

ответ

7

У меня были проблемы с этим и Naughter бесплатно XTaskDialog API, чтобы получить резервный механизм на компьютерах под управлением Windows XP с помощью эмуляции, что делает реализацию этого диалога более полезной. :)

В моем случае это был вопрос контекста активации, как указано в этом blog entry.

Или, цитируемый здесь, в случае, если сообщение в блоге теряется в киберпространстве нибудь (относится к Visual Studio):

  1. Откройте свойства проекта в обозревателе решений
  2. На вкладке Безопасность, установите флажок Включить параметры безопасности ClickOnce,
  3. Теперь вы можете видеть, появляясь в app.manifest файл в папке Свойства вашего решения, откройте его,
  4. под </trustInfo > тега, вставьте код, приведенный ниже.
  5. Если вы пытаетесь построить, может возникнуть ошибка. Чтобы устранить эту проблему, снимите флажок Включить параметры безопасности ClickOnce.

Код для вставки в шаге 4:

<dependency> 
    <dependentAssembly> 
    <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" 
     version="6.0.0.0" processorArchitecture="*" 
     publicKeyToken="6595b64144ccf1df" language="*" /> 
    </dependentAssembly> 
</dependency> 
+0

Спасибо, мы попробуем. –

+0

У меня такая же проблема в проекте библиотеки dll (плагин Excel). В библиотеке VS нет закладки безопасности для проектов библиотеки? –

+1

В настоящее время (VS 2012/2013) это решение не работает :(Это, однако, работает как прелесть: http://support.microsoft.com/kb/830033 –

1

Я бы предложил сравнить версию comctl32.dll с рабочими и нерабочими машинами Vista и сравнить их контрольные суммы, даже если они сообщают о той же версии.

Другие вещи, чтобы проверить:

  • Возможно ли, что неработающие машина имеет версию пре-релиза Vista?
  • Возможно ли, что версия comctl32.dll, отличная от Vista, была скопирована на компьютер и подхвачена приложением? (Утилита Depends, которая поставляется с Visual Studio, может помочь здесь.)
  • Возможно ли, что вирус или червь (или что нет) заменили comctl32.dll?

Возможно, стоит прочитать этот article об условиях активации.

+0

Спасибо, мы посмотрим на это. Если это приведет нас к ответу, я приму ваш ответ как правильный. –

1

Если другие машины, которые вы использовали для запуска программы, использовали Vista x86, вполне вероятно, что в вашем коде есть PInvoke, вызывающий проблему. Возможно, вы захотите установить целевую архитектуру компилятора на x86, чтобы заставить вашу программу работать в WoW64 на x64 Vista. По умолчанию Visual Studio использует компоновки компоновки настроек в архитектурно-агностических целях. Это означает, что при попытке запустить .NET-программу на 64-битной системе ее следует запустить с помощью собственной версии x64 для CLR. Attemptiong для загрузки 32-разрядной DLL в этом контексте завершится с ошибкой. Вместо этого приложение для запуска в эмулированном режиме x86 должно сделать трюк.

+0

Спасибо, но мы уже установили приложение для компиляции как x86, так как мы используем некоторые компоненты, которые не готовы к работе с x64. –

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