2014-01-16 27 views
0

我有一位客戶報告特定路徑中的文件存在問題。調試一些舊的Windows代碼,我發現那些失敗的代碼是對StgOpenStorage()的調用。有問題的路徑失敗了,有一個em-dash。如果我通過重命名文件來取出這個em-dash,那麼對StgOpenStorage()的調用就會成功。使用StgOpenStorage支持Windows文件路徑中的em-dash

所以我的問題是這樣的:這是這個函數的一個已知限制嗎?是否可能有其他Windows SDK功能失敗,並顯示特殊字符如em-dash?我注意到在調用這個函數之前調用了mbstowcs(),這讓我想知道這個問題是否是由於代碼頁錯誤地映射了em-dash字符。在調用之前,Visual Studio調試器中的wchar路徑看起來不錯,所以看起來很奇怪,該函數會在系統允許的路徑上失敗。

+0

*「在調用此函數之前有一個調用mbstowcs()」* - 這幾乎肯定是問題所在,它可能轉換爲不同的UNICODE字符或根本無法轉換,然後'StgOpenStorage'可以'找到該文件。當它失敗時,你會得到什麼錯誤代碼?它是'STG_E_FILENOTFOUND'嗎? –

回答

1

你是對的羅傑羅蘭德,這是由於在調用mbstowcs()之前的活動區域設置。我通過以下方式解決了此問題:

setlocale(LC_ALL, ""); 

在調用mbstowcs()之前。它看起來像出於某種原因,「C」語言環境不支持破折號,彷彿我設置此相反,它失敗:

setlocale(LC_ALL, "C"); 

我的區域設置設置爲英語(澳大利亞)。

乾杯。