С каких это пор OPENFILENAME.lpstrDefExt поддерживает расширения, содержащие более трех символов?

Текущая версия документации Windows API для Структура OPENFILENAME гласит (выделено мной):

lpstrDefExt
Type: LPCTSTR

The default extension. GetOpenFileName and GetSaveFileName append this extension to the file name if the user fails to type an extension. This string can be any length, but only the first three characters are appended. The string should not contain a period (.). If this member is NULL and the user fails to type an extension, no extension is appended.

Это неверно, как показывает выполнение следующего 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 поддерживает более трех символов?

«обратите внимание, что это устаревшая документация, возможно, восходящая к Windows 3.1, когда имена были ограничены форматом 8.3. По крайней мере, с Vista, она принималась дольше (только что подтвердил, что и в Windows 10)».
CodeCaster 02.05.2018 17:11

@CodeCaster: Спасибо, это очень актуально! "по крайней мере, с Vista ..." было бы идеально, так как мне нужно поддерживать Windows 7 / Server 2008 и выше.

Heinzi 02.05.2018 17:13

В Vista и более поздних версиях Get(Open|Save)FileName() являются оболочками для новых интерфейсов IFile(Open|Save)Dialog (если вы не укажете флаг OFN_ENABLEHOOK), которые не имеют многих из тех же ограничений, что и старые API.

Remy Lebeau 02.05.2018 17:21

Кроме того, начиная с Vista рекомендуется использовать Диалог обычных предметов, а не GetOpenFilename.

theB 02.05.2018 17:23

Это началось 25 лет назад, начиная с эмуляции имен файлов MS-Dos 8.3. Файл с именем longfilename.xlsx имеет дополнительную запись в каталоге, которая будет напоминать longfi ~ 1.xls. Что соответствует подстановочному знаку * .xls. Эту поддержку давно пора отключить, особенно для версий x64, которые больше не могут поддерживать 16-битный код, но сегодня все еще включены по умолчанию. Все, что вы можете с этим сделать, - это проверить имена, которые вы получите.

Hans Passant 02.05.2018 17:37

@RemyLebeau: Ради удовольствия, я просто попытался добавить крючок. Он по-прежнему поддерживает расширение длинного имени файла, но, вау, полученный диалог вернул 16-битную память: imgur.com/a/bEPtMTL

Heinzi 02.05.2018 17:46

@theB: Хороший совет. В моем случае это не вариант, поскольку мы вызываем диалог из VBA, а эти диалоги не работают с VBA. Я только что создал программу C как MVCE.

Heinzi 02.05.2018 17:49

@Heinzi Вы можете получить диалог Win95-XP с помощью ловушки, вам просто нужно включить флаг проводника, иначе вы получите стиль Windows 3.

Anders 03.05.2018 01:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
8
478
0

Другие вопросы по теме