wcscat_s String不以null结尾

时间:2014-02-23 16:35:34

标签: c++ api window

我想要选择所有文件名用户。返回字符串的格式如下: 文件夹用户选择了| filename1 | filename2 ......

这是我的代码,用于创建多选对话框,获取选定的文件名,并将它们复制到缓冲区变量。文件名由“|”分隔

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(buffer,2,L“| \ 0”);

你能解释一下为什么以及如何解决它。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

wcscat_s接受缓冲区大小作为第二个参数,而不是附加序列的大小,因此它应该是:

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

代替。您收到此错误,因为当前缓冲区中的前两个字符当然都不是“\ 0”。