Текущая версия документации Windows API со структурой OPENFILENAME
(выделено мной):
lpstrDefExt
Тип: LPCTSTR
Расширение по умолчанию. GetOpenFileName
и GetSaveFileName
добавляют это расширение к имени файла, если пользователь не может набрать расширение. Эта строка может быть любой длины, но добавляются только первые три символа. Строка не должна содержать точку (.). Если этот элемент NULL
и пользователь не может набрать расширение, расширение не добавляется.
Это неверно, так как выполнение следующего MVCE в Windows 10 (сборка 17134.5) показывает:
#include <stdio.h>
#include <Windows.h>
int main()
{
wchar_t filename[256] = { 0 };
OPENFILENAMEW ofn =
{
.lStructSize = sizeof(OPENFILENAMEW),
.lpstrFilter = L"All Files\0*.*\0\0",
.lpstrFile = filename,
.nMaxFile = sizeof(filename),
.lpstrDefExt = L"xlsx"
};
BOOL ret = GetSaveFileNameW(&ofn);
if (ret != 0)
{
wprintf(L"%s\r\n", filename);
}
}
Ввод test
в диалоговом окне Сохранить файл приводит к C:\Users\...\Documents\test.xlsx
, а не C:\Users\...\Documents\test.xls
, как утверждается в документации.
Когда это изменилось, то есть, на какие целевые системы можно положиться на lpstrDefExt
с поддержкой более трех символов?