Vista TaskDialog Wrapper: не удается найти точку входа с именем «TaskDialogIndirect» в DLL «ComCtl32» - PullRequest
1 голос
/ 21 января 2012

Я пытаюсь использовать Vista TaskDialog Wrapper и эмулятор , и я получаю следующее исключение:

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

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

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        System.Threading.Thread.CurrentThread.CurrentUICulture = System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

        PSTaskDialog.cTaskDialog.MessageBox(
            "MessageBox Title",
            "The main instruction text for the message box is shown here.",
            "The content text for the message box is shown here and the text willautomatically wrap as needed.",
            PSTaskDialog.eTaskDialogButtons.YesNo,
            PSTaskDialog.eSysIcons.Information
        );
     }
}

Что я делаю не так?

ОБНОВЛЕНИЕ:

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

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

Ответы [ 2 ]

1 голос
/ 30 января 2012

Я давно не занимался программированием в Office, но я предполагаю, что Excel загружает обе версии comctl32, поэтому вам может потребоваться использовать API-интерфейс Activation Context, чтобы направить ваш код в версию, включающую TaskDialog. Некоторые идеи для решения проблемы (не решения как таковые):

  • В целях тестирования выполните временное перечисление всех модулей в активном процессе - просто чтобы проверить, действительно ли загружен 6.10 (простой пример такого перечисления см. Ниже, хотя и с другим намерением).

  • Используйте API-интерфейс активации , чтобы получить нужную версию. Пример использования из C # (для включения тем посредством comctl32 6.0) здесь .

  • В качестве альтернативы (я никогда не делал так, чтобы это работало надежно в приложении 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;
   }
}
0 голосов
/ 30 января 2012

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

...