2014-02-23 67 views
0

我想要獲取所有文件名用戶選擇。返回字符串的格式如下: 用戶選擇的文件夾| filename1 | filename2 ......wcscat_s字符串不爲空終止

這裏是我的代碼,用於創建多選對話框,獲取選定的文件名,並將它們複製到緩衝區變量中。文件名由「|」分隔

HWND hDlg = NULL; 
wchar_t* buffer = new wchar_t[32768]; 
void ShowDialog() 
{ 
    OPENFILENAME ofn; 
    wchar_t szFile[32768]; 
    ZeroMemory(&ofn, sizeof(ofn)); 
    ofn.lStructSize = sizeof(ofn); 
    ofn.hwndOwner = hDlg; 
    ofn.lpstrFile = (wchar_t*)szFile; 
    ofn.lpstrFile[0] = '\0'; 
    ofn.nMaxFile = sizeof(szFile); 
    ofn.lpstrFileTitle = NULL; 
    ofn.nMaxFileTitle = 0; 
    ofn.lpstrInitialDir = NULL; 
    ofn.Flags = OFN_ALLOWMULTISELECT | OFN_ENABLESIZING | OFN_EXPLORER; 
    if(GetOpenFileName(&ofn) == TRUE) 
    { 
     if(szFile[ofn.nFileOffset-1] != '\0') 
     { 
      wcscpy_s(buffer,sizeof(szFile),szFile); 
     } 
     else 
     { 
      //Multi-select 
      wchar_t* p= szFile; 
      int i =0; 
      while(*p) 
      { 
       wchar_t* temp = new wchar_t[1024]; 
       //Copy p into temp 
       wcscpy_s(temp,1024,p); 
       if(i==0) 
       { 
        //copy folder name into buffer 
        wcscpy_s(buffer,1024,temp); 
       } 
       else 
       { 
        //cat file name with buffer 
        wcscat_s(buffer,1024,temp); 
       } 
       //seperated folder name and files name with "|" 
       wcscat_s(buffer,2,L"|\0"); 
       i++; 
       p += lstrlen(p) + 1; 
      } 
     } 
    } 
} 

當調試這個代碼,運行時間錯誤: 「的字符串不是空終止」 時,會出現在線路碼:wscat_s(緩衝液,2,L 「| \ 0」);

你能否向我解釋爲什麼以及如何解決它。

感謝您的幫助

+0

使用C++字符串不是更容易嗎? –

+0

@DavidHeffernan:是的,我會試試看。 – Beginner

回答

2

wcscat_s接受緩衝區的大小作爲第二個參數,而不是序列的大小被追加,所以它應該是:

wcscat_s(buffer, 32768, L"|"); 

代替。你會得到這個錯誤,因爲肯定沒有任何緩衝區中的前兩個字符是'\ 0'。

+0

謝謝你,現在工作。但我不明白爲什麼1024是第二個參數。「wcscat_s接受緩衝區大小作爲第二個參數」,但是當我通過使用sizeof(緩衝區)調試緩衝區大小。它的輸出是4.請爲我解釋。 – Beginner

+1

您的'buffer'變量是一個指針,而不是一個數組,因此'sizeof()'返回32位系統上4個字節的指針的大小。 –

+0

將大小更改爲32768以匹配實際緩衝區大小(但對於靜態大小的數組,應該使用常量/變量或sizeof())。 –