2014-03-13 26 views
3

我正在創建一些文件打開對話框,並偶然發現了WinAPI中不一致的東西(嘿嘿)。爲什麼OPENFILENAME lpstrFileTitle參數爲LPSTR而不是LPCSTR?

我完全理解爲什麼lpstrFileLPSTR作爲路徑寫入此變量。

很好,但爲什麼lpstrFileTitle不是LPCSTR?我已閱讀MSDN上的文檔並搜索了一遍,發現沒有令人滿意的解釋,因爲它看起來不像是以任何方式修改。

這是一個兼容性殘留或什麼?

因爲我不能使用c_str()和求助於&str[0],所以在傳遞std :: string時會導致惱人的解決方法。

回答

6

lpstrFileTitle也是一個輸出緩衝區。它包含沒有所選文件的路徑信息的名稱和擴展名。

+0

我只是編輯我的帖子,因爲我也意識到這一點。本來希望MSDN以類似於'lpstrFile'的方式來提示它。謝謝! – Samuel

1

相關方面:您必須將lpstrFileTitle設置爲非Unicode版本的有效緩衝區。

OPENFILENAME的文檔指出,如果指針爲空,則忽略該字段。然而,由於至少VS2008的MFC的CFileDialog代碼已經包含在此代碼:

VC\atlmfc\src\mfc\dlgfile.cpp 
void CFileDialog::UpdateOFNFromShellDialog() 
{ 
... 
#ifdef UNICODE 
... 
#else 
    ::WideCharToMultiByte(CP_ACP, 0, wcPathName + offset,-1, m_ofn.lpstrFileTitle, m_ofn.nMaxFileTitle, NULL, NULL); 
    m_ofn.lpstrFileTitle[m_ofn.nMaxFileTitle - 1] = _T('\0'); 
#endif 
... 

的Unicode支持,正確處理空lpstrFileTitle和調用WideCharToMultiByte基本上什麼都不做。但是,添加的代碼安全地終止緩衝區不會檢查空指針或nMaxFileTitle == 0。結果是訪問衝突。

更好的辦法是殺死多字節應用程序,但是如果您必須以這種方式進行編譯,則必須提供該緩衝區。

相關問題