SHGetPathFromIDList()(和类似的)在它的参数中是否终止了0?

这其实是一个关于大量winapi函数的问题。 一个典型的MS文档说(来自http://msdn.microsoft.com/en-us/library/bb762194(VS.85).aspx ):

 BOOL SHGetPathFromIDList(      
     PCIDLIST_ABSOLUTE pidl,
     LPTSTR pszPath
 );

 pidl [in]指定文件的项目标识符列表的地址
或相对于名称空间(桌面)根目录的目录位置。

 pszPath [out]接收文件系统path的缓冲区的地址。
此缓冲区的大小必须至less为MAX_PATH个字符。

没有任何关于终止0是否写入pszPath的说法。 另外,它没有说明path是否可以填充pszPath,在那里没有空间。

大约50/50的用户分配MAX_PATH + 1字符的缓冲区和只处理MAX_PATH的用户。

虽然我当然可以做一些类似char buf [MAX_PATH + 1] = {0}的事情来保证安全,但是我真的很想知道 – 有没有一些地方可以描述这些东西呢? 所有path相关的function的一些页面可能,我不知道…

回答标题问题:是的。 它是LPTSTR定义的一部分 – 一个指向字符串的指针。 它也反映在前缀: psz – “指针(到)字符串(终止)零”。

还有一个非null终止的字符串类型,但在用户空间API中很少见: UNICODE_STRING 。 你主要在内核级的API中看到它

它说“这个缓冲区的大小必须至少为MAX_PATH个字符”,因此对于pszPath参数, MAX_PATH缓冲区大小应该总是足够的。 另外我相信所有处理LPCTSTR / LPTSTR参数的Win32函数都期望或返回以空字符结尾的字符串。

我不知道这个函数(或者其他的)是如何实际运行的,但是我建议你写一些针对这个函数的单元测试。当你不使用所有的缓冲区时会发生什么? 如果你这样做会怎样? 等等。这些文档不仅会记录你的假设,但是如果函数改变了它的行为方式,你将从单元测试中得到一个警告,而不是经历一个令人讨厌的错误报告。