2015-12-04 60 views
0

我試圖將文件的擴展名篩選器應用於文件的選擇對話框。Winapi GetOpenFileName擴展名篩選器不工作

這樣工作的:

ofn.lpstrFilter = 
"(*.exe) Windows Executable\0*.exe\0" 
"(*.ini) Windows Initialization file \0*.ini\0" 
"(*.dll) Dynamic Link Library \0*.dll\0" 
"(*.lib) Windows Library file \0*.lib\0" 
"(*.conf) Windows Configuration file \0*.conf\0"; 

enter image description here

但是當我指定擴展動態過濾器,通過參數,它失敗了,過濾器不會出現在組合框中:

LPCSTR filter = (LPCSTR)extFilter; //Contains string "bmp" 

stringstream s; 
s << "(*.exe) Windows Executable\0" << "*." << filter << "\0"; 
string ffilter = s.str(); 
ofn.lpstrFilter = ffilter.c_str(); 

enter image description here

我是大人問題是在字符串轉換中,但無法弄清楚。

+0

沒有測試,我猜測分隔符''\ 0''可能會傷害'stringstream'。如果是這樣,如何使用另一個字符(如'$')作爲分隔符,並在完成構建過濾器之後,將字符串複製到'char'數組並將'$'s轉換爲''\ 0''? – MikeCAT

+0

您是否試過在調試器中查看'ffilter'來查看它包含的內容? –

+0

這裏的任何消息?人們正在等待... :) –

回答

-1

終於找到答案:

const char * extensionFilter = myParamVar; //Contains "JPG" string 

string sFilter; 
sFilter.append("Format: "); 
sFilter.append(extensionFilter); 
sFilter.push_back('\0'); 
sFilter.append("*."); 
sFilter.append(extensionFilter); 
sFilter.push_back('\0'); 

//Current filter content --> Format: JPG\0*.JPG\0 

const char * filter = sFilter.c_str(); //Char string conversion 
ofn.lpstrFilter = filter; //Set the filter to the sctructure's member. 

//Opens the dialog and it successfully applies the filter. 
if (GetOpenFileName(&ofn)==TRUE){ 
. . . 
0

您正在使用某個臨時字符串的指針,根據http://www.cplusplus.com/reference/string/string/c_str/,「可能會因修改對象的其他成員函數的進一步調用而失效」。

+0

「任何進一步的方法調用」是不太可能的,因爲可能沒有。更可能的是臨時串流本身超出了範圍並被釋放。 – andlabs

+0

沒有臨時參與。 'stringstream'內容被分配給一個'string'變量,它保持在範圍內,直到對話被解除。 –

+0

@RemyLebeau - 這是一個很好的猜測,但我沒有看到對發佈片段中的對話框的調用。 –

1

這條線:

s << "(*.exe) Windows Executable\0" << "*." << filter << "\0"; 

是通過空值終止char*字符串operator<<(),從而有效地行爲與此相同的代碼在運行時:

s << "(*.exe) Windows Executable" << "*." << filter << ""; 

的空值永遠不會使其進入s

要正確插入空值,則需要將它們分配到stringstream個別char值,而不是作爲char*值:

s << "(*.exe) Windows Executable" << '\0' << "*." << filter << '\0'; 

而且,事實上,你的類型轉換extFilter是可疑的。如果您必須這樣做才能擺脫編譯器錯誤,那麼extFilter不是兼容的數據類型,類型轉換會隱藏代碼中的錯誤。擺脫類型演員:

LPCSTR filter = extFilter; //Contains string "bmp" 

如果代碼無法編譯,那麼你做錯了什麼,需要正確解決它。

在另一方面,如果extFilter是一個空值終止字符串char開始用,你不需要它傳遞給operator<<()之前將其分配給一個變量:

s << "(*.exe) Windows Executable" << '\0' << "*." << extFilter << '\0'; 
0

一個較短的版本:

ofn.lpstrFilter = _T("Format: XML\0*.xml\0");