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

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

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

В Visual Studio 2008 при отладке приложения нет проблем с Vista API.Когда решение обновляется до Visual Studio 2010 (работает в Windows 7), пользователь пытается отладить приложение, и пользователь желает получить доступ к диалоговому окну открытия файла 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 с Vista API, и проблема также возникает в этом решении.Пример проекта можно скачать (в формате ZIP) с здесь .Чтобы воспроизвести проблему:

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

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

1 Ответ

0 голосов
/ 20 мая 2011

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

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

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()
...