在 WINBASE.h 中,有这样的定义:
#define OFS_MAXPATHNAME 128 typedef struct _OFSTRUCT { BYTE cBytes; BYTE fFixedDisk; WORD nErrCode; WORD Reserved1; WORD Reserved2; CHAR szPathName[OFS_MAXPATHNAME]; } OFSTRUCT, *LPOFSTRUCT, *POFSTRUCT;
在API函数OpenFile() 中, szPathName 中会返回所打开文件的完整路径。
本人看了一下,它是ANSI格式编码、支持长文件名。
即使在“DOS时代”,它还没有“长文件名”的概念,路径+文件名的总长度也可以达到255字节;
更何况Windows系统都是支持长文件名的了,路径+文件名的字节数超过255已经是很平常的事了。
那么,在 WINBASE 的定义中,OFSTRUCT的szPathName成员,它为什么才分配128字节的空间?
这不是很容易造成“缓冲区溢出”吗!
有没有哪位高手,给个合理的解释呢?
解决方案
4
MSDN不是写明白了吗,这玩意应该用CreateFile取代,out啦
原文:
The OFSTRUCT structure contains a path string member with a length that is limited to OFS_MAXPATHNAME characters, which is 128 characters. Because of this, you cannot use the OpenFile function to open a file with a path length that exceeds 128 characters. The CreateFile function does not have this path length limitation.
原文:
The OFSTRUCT structure contains a path string member with a length that is limited to OFS_MAXPATHNAME characters, which is 128 characters. Because of this, you cannot use the OpenFile function to open a file with a path length that exceeds 128 characters. The CreateFile function does not have this path length limitation.
6
16 位的 Windows 上都是 8.3 命名比较多吧,那个时候可能 128 就够用了。微软为了兼容这个 API 才保留的。但这个限制依然是 128,这点很无语。问题是,很多人可能仅仅是图方便,不想去写 CreateFile 的那一大堆参数而已。假如没有路径长度限制,这个 API 用的人应该还很多,虽然它过时了。
4
没准再过几年,题主就会问:_MAX_PATH为啥是260而不是2600了。
4
获取10年后你会说干嘛不定义成1024或2048, 256或512太小了
32