Проблема с отладкой решения Visual Studio 2010, использующего FileDialog из Vista API

2

У меня есть решение WinForms С# Visual Studio 2008 (.NET 3.5), которое должно быть обновлено до Visual Studio 2010 (.NET останется на версии 3.5). Это решение использует FileDialog из API Vista по двум причинам:

  • При запуске приложения в Windows XP ожидание заключается в том, чтобы предоставить пользователю диалоговое окно поиска в стиле Windows XP. При запуске одного и того же приложения в Windows Vista и 7 диалоговое окно файла должно иметь внешний вид Vista.
  • Что еще более важно, наше приложение позволяет пользователю открыть файл проекта, который может быть либо локальным файлом (хранящимся на пользовательском компьютере, либо на USB-устройстве), либо проектом сервера (размещенным в MS SQL Server). Для этого мы используем API-интерфейс Vista, так как мы можем получить доступ к обработчику событий элемента управления выпадающим списком типа файла. Следовательно, реализация такова, что пользователю предоставляется диалоговое окно открытого файла, и когда они выбирают параметр "Сервер" в раскрывающемся списке типа файла, диалог открытия файла закрывается, и открывается другое диалоговое окно, что позволяет пользователь, чтобы выбрать сервер, к которому они хотят подключиться, и проект сервера.

В Visual Studio 2008 при отладке приложения нет проблем с API-интерфейсом Vista. Когда решение обновляется до Visual Studio 2010 (работает в Windows 7), пользователь пытается отладить приложение, и пользователь хочет получить доступ к диалоговому окну Open API Vista, приложение вылетает с созданием ArgumentException со следующим сообщением: "Значение не входит в ожидаемый диапазон". Как ни странно, когда пользователь запускает решение без отладки (Ctrl + F5) из Visual Studio 2010, исключений не возникает. "Оскорбительный" код:

internal void DoFolderChange(IFileDialog dialog)
{
    IShellItem ppsi = null;
    string ppszName = string.Empty;
    dialog.GetFolder(out ppsi);

    // Exception occurs here
    ppsi.GetDisplayName(NativeMethods.SIGDN.SIGDN_FILESYSPATH, out ppszName);
    OnFolderChange(ppszName);
}

Я пробовал поиск в Google, но безрезультатно. У меня есть образец решения Visual Studio 2010 с API-интерфейсом Vista, и проблема также возникает в этом решении. Образец проекта можно скачать (в форме ZIP) из здесь. Чтобы воспроизвести проблему:

  • Отладить решение в Visual Studio 2010.
  • После запуска "Vista Api Demo" нажмите вкладку "Диалоги".
  • В столбце "Vista Look", расположенном в правой части вкладки "Диалоги", нажмите кнопку "Открыть файл".
  • Появится диалог с сообщением "Тип файла был изменен на 1". Нажмите кнопку OK.
  • Обратите внимание, что в этот момент приложение вылетает с ошибкой, исключенной из метода DoFolderChange (IFileDialog) в clsFileDialog.cs.

Мои извинения за длинный пост, но мне нужно было объяснить весь фон, почему требуется реализация диалогового окна API Vista. Я очень благодарен за помощь в решении этой проблемы, так как моя команда разработчиков работает над Visual Studio 2010, и мы не хотим, чтобы разработчики не пытались объединять и отделять отладчик, чтобы обойти эту проблему.

Теги:
winapi
visual-studio-2010
.net-3.5
windows-vista

1 ответ

0

Я наткнулся на это, и я решил исправить в моем случае.

Оригинальный код:

OpenFileDialog fdlg = new OpenFileDialog();
string tempDirectoryName = @"..\SomeFolder\"; /* Note, the use of a relative directory*/
fdlg.InitialDirectory = tempDirectoryName ;
Nullable<bool> result = fdlg.ShowDialog();

Затем я изменил его на:

OpenFileDialog fdlg = new OpenFileDialog();
string tempDirectoryName = @"..\SomeFolder\"; /* Note, the use of a relative directory*/
string massagedDirectoryName = System.IO.Path.**GetFullPath**(tempDirectoryName);
fdlg.InitialDirectory = massagedDirectoryName; /*Note, this is now the full folder name */
Nullable<bool> result = fdlg.ShowDialog();

И это больше не бомбило меня.

Мой был почти таким же сценарием.

Мой сценарий:

Код был WPF-приложением в VS2008 и работал. (3.5 Framework была целевой структурой) Я преобразован в код в VS2010 (4.0 Framework был Target Framework). Затем возникла новая проблема.

Обе базы кода были запущены в Windows 7 x64.

.............

Моя полная ошибка:

 Value does not fall within the expected range.
    at MS.Internal.Interop.HRESULT.ThrowIfFailed(String message)
    at MS.Internal.AppModel.ShellUtil.GetShellItemForPath(String path)
    at Microsoft.Win32.FileDialog.PrepareVistaDialog(IFileDialog dialog)
    at Microsoft.Win32.FileDialog.RunVistaDialog(IntPtr hwndOwner)
    at Microsoft.Win32.CommonDialog.ShowDialog()
  • 0
    Спасибо за ваш ответ granadaCoder. Честно говоря, я не рассматривал эту проблему в течение некоторого времени, однако мой коллега также нашел решение моей проблемы. Хотя я не видел точную природу его исправления, он обнаружил, что в коде были события, которые мы не использовали, поэтому он не зарегистрировал эти события, и сбой не произошел. Когда я в следующий раз получу возможность, я посмотрю на исправление моего коллеги так же, как и на ваше. Еще раз спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню