OPENFILENAME.lpstrDefExt何时支持超过三个字符的扩展名?
问题
OPENFILENAME结构体的lpstrDefExt成员从何时开始支持超过三个字符的扩展名?
当前Windows API文档中关于OPENFILENAME结构体的描述(笔者加粗部分):
lpstrDefExt
类型:LPCTSTR
默认扩展名。若用户未输入扩展名,GetOpenFileName和GetSaveFileName会将此扩展名追加到文件名后。该字符串可以是任意长度,但仅会追加前三个字符。字符串不应包含句点(.)。若此成员为NULL且用户未输入扩展名,则不会追加任何扩展名。此描述并不正确……
回答
其实这个文档描述确实有点滞后了。实际上,从Windows Vista开始,lpstrDefExt就已经支持超过三个字符的扩展名了——只要你在使用OPENFILENAME时设置了OFN_EXPLORER标志(这也是Vista及以后系统的默认行为)。
在Vista之前的系统(比如Windows XP)里,情况确实像文档说的那样,只会截取前三个字符追加到文件名后。但Vista引入了新的文件对话框实现,这个限制就被移除了,现在你可以指定任意长度的合法扩展名(当然还是不能包含句点),系统会完整追加它。
举个简单的例子,如果你的lpstrDefExt设为"markdown",用户输入文件名"notes",那么最终的文件名会是"notes.markdown",而不是被截断成"notes.mar"。
不过要注意,如果你刻意不使用OFN_EXPLORER标志(比如为了兼容旧的对话框样式),那还是会遵循旧的三字符限制,所以建议始终使用默认的OFN_EXPLORER模式来获得完整的长扩展名支持。
内容的提问来源于stack exchange,提问作者Heinzi

