Я хочу, чтобы все имя пользователя было выбрано пользователем. Формат возвращаемой строки похож: выбран пользователь папки | filename1 | имя_файла2......
Вот мой код для создания диалога с несколькими выборами, получения выбранных имен файлов и копирования их в буферную переменную. Имена файлов разделяются символом "|"
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");
Не могли бы вы объяснить мне, почему и как это исправить.
Спасибо, что помогли
wcscat_s
принимает размер буфера в качестве второго аргумента, а не размер добавляемой последовательности, поэтому он должен быть:
wcscat_s(buffer, 32768, L"|");
вместо. Вы получаете эту ошибку, потому что, конечно, ни один из первых двух символов в вашем буфере не равен "\ 0".
buffer
переменная является указателем, а не массивом, поэтому sizeof()
возвращает размер указателя, который составляет 4 байта в 32-разрядной системе.