关于c ++:SHGetPathFromIDList()(和类似方法)是否在其参数中添加一个终止0?

Does SHGetPathFromIDList() (and similar) put a terminating 0 in its argument?

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

1
2
3
4
5
6
7
8
9
10
BOOL SHGetPathFromIDList(      
    PCIDLIST_ABSOLUTE pidl,
    LPTSTR pszPath
);

pidl [in] The address of an item identifier list that specifies a file
or directory location relative to the root of the namespace (the desktop).

pszPath [out] The address of a buffer to receive the file system path.
This buffer must be at least MAX_PATH characters in size.

它没有说明是否将终止0写入pszPath。 同样,它也没有说路径是否可以填充pszPath,那里没有空间容纳0。

在yeidls上搜索大约50/50的分配了MAX_PATH + 1个字符的缓冲区的用户和仅处理MAX_PATH的用户的分布。

为了安全起见,我当然可以做一些类似char buf [MAX_PATH + 1] = {0}的事情,但我真的很想知道-是否在某些地方描述了这些内容? 我可能不知道所有与路径相关的功能的页面...


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


要回答标题问题:是。它是LPTSTR定义的一部分-字符串的指针。它也反映在前缀中:psz-"指针(至)字符串(以零终止)"。

也有一个非null终止的字符串类型,但是在userland API的UNICODE_STRING中很少见。您主要在内核级API中看到它


我不知道此函数(或其他函数)的实际行为,但我建议针对此函数编写一些单元测试...如果不使用所有缓冲区,会发生什么?如果这样做会怎样?等等。这些不仅会记录您的假设,而且如果函数改变了其行为方式,则单元测试将发出警告,而不会出现令人讨厌的错误报告。