2011-03-22 66 views
2

我有一個WinForms C#Visual Studio 2008(.NET 3.5)解決方案將升級到Visual Studio 2010(.NET保持在3.5版本)。此解決方案利用Vista API中的FileDialog有兩個原因:調試利用Vista API中的FileDialog的Visual Studio 2010解決方案問題

  1. 在Windows XP中運行應用程序時,期望爲用戶提供Windows XP外觀文件對話框。在Windows Vista和7中運行相同的應用程序時,文件對話框應具有Vista外觀。
  2. 更重要的是,我們的應用程序允許用戶打開一個項目文件,該文件可以是本地文件(存儲在用戶機器上或USB設備上)或服務器項目(託管在MS SQL Server中)。爲了實現這一點,我們使用Vista API,因爲我們可以訪問文件類型下拉列表控件的事件處理程序。因此,實現是爲用戶提供打開的文件對話框,當他們從文件類型下拉列表中選擇「服務器」選項時,打開的文件對話框關閉,並打開一個不同的對話框,允許用戶選擇他們希望連接的服務器和服務器項目。

在Visual Studio 2008中調試應用程序時,Vista API沒有任何問題。當解決方案升級到Visual Studio 2010(在Windows 7中運行)時,用戶嘗試調試應用程序,並且用戶希望訪問Vista API打開文件對話框,應用程序崩潰時會拋出ArgumentException,並顯示以下消息: 「價值不在預期範圍內」。當用戶在沒有從Visual Studio 2010進行調試(Ctrl + F5)的情況下運行解決方案時,奇怪的是沒有發生異常。 「違規」代碼是:

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); 
} 

我試過一些谷歌搜索,但無濟於事。我已經提供了帶有Vista API的示例Visual Studio 2010解決方案,並且此解決方案中也存在此問題。示例項目可以從here下載(ZIP格式)。要重現該問題:

  1. 調試在Visual Studio 2010
  2. 的解決方案一旦「Vista的API演示」推出後,點擊「對話框」選項卡上。
  3. 從位於「對話框」選項卡右側的「Vista Look」列中,單擊「打開文件」按鈕。
  4. 將顯示一條消息「文件類型已更改爲1」的對話框。點擊確定按鈕。
  5. 注意到此時應用程序崩潰,clsFileDialog.cs中的DoFolderChange(IFileDialog)方法拋出異常。

我對這篇冗長的文章感到抱歉,但我需要解釋爲什麼需要Vista API文件對話框實現的整個背景。我很感謝解決此問題的任何幫助,因爲我的開發團隊正在考慮與Visual Studio 2010合作,並且我們的開發人員不希望擺脫附加和分離調試器的作用,只是爲了繞過此問題。

回答

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

,並沒有在我身上了炸彈。

煤礦幾乎是相同的情況。

我的場景:

代碼是在VS2008下工作的WPF應用程序。 (3.5框架是目標框架) 我將代碼轉換爲VS2010(4.0框架是目標框架)。然後出現這個新問題。

這兩個代碼庫都在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。說實話,我還沒有看過這個問題一段時間,但我的一個同事也找到了解決我的問題。儘管我沒有看到他的修復的確切性質,但他發現在代碼中有一些我們沒有使用的事件,所以他沒有註冊這些事件並且沒有發生崩潰。當我接下來有機會的時候,我會看看我的同事以及你的同事。再次感謝! – 2011-05-22 11:43:41

相關問題