Winapi 在Vista中使用Win32/Shell PathCombine()从relative获取绝对路径似乎失败

Winapi 在Vista中使用Win32/Shell PathCombine()从relative获取绝对路径似乎失败,winapi,windows-vista,relative-path,absolute-path,Winapi,Windows Vista,Relative Path,Absolute Path,不确定这是否是我使用的预期行为、bug或错误函数,但问题是PathCombine在Vista框上返回了错误的路径 WMP将相对路径导出到播放列表: ..\..\..\Public\Music\Sample Music\Amanda.wma 其相对路径为: C:\Users\userX\Music\Playlists\playlist.wpl 和PathCombine返回: C:\Users\userX\Public\Music\Sample Music\Amanda.wma 但是,根据浏览器和我

不确定这是否是我使用的预期行为、bug或错误函数,但问题是PathCombine在Vista框上返回了错误的路径

WMP将相对路径导出到播放列表:

..\..\..\Public\Music\Sample Music\Amanda.wma

其相对路径为:

C:\Users\userX\Music\Playlists\playlist.wpl

和PathCombine返回:

C:\Users\userX\Public\Music\Sample Music\Amanda.wma

但是,根据浏览器和我无法从代码中打开的事实判断,文件实际上位于此处:

C:\Users\Public\Music\Sample Music\Amanda.wma

这是一个已知的问题吗?是否应该使用其他函数?

指定第二个参数lpszDir是指向包含目录路径的最大长度为MAX_PATH的以null结尾的字符串的指针。您似乎在传递目录中文件的完全限定名,而不是目录的完全限定名。因此,它删除了三个组件:playlist.wpl、Playlists和Music,然后附加其余部分

您应该能够使用从目录路径中删除文件部分。

指定第二个参数lpszDir是指向包含目录路径的最大长度为MAX_path的以null结尾的字符串的指针。您似乎在传递目录中文件的完全限定名,而不是目录的完全限定名。因此,它删除了三个组件:playlist.wpl、Playlists和Music,然后附加其余部分


您应该能够使用从目录路径中删除文件部分。

当您组合两个字符串时,您会得到以下结果

C:\Users\userX\Music\Playlists\playlist.wpl\..\..\..\Public\Music\Sample Music\Amanda.wma
自从。。将删除前面的部分,按以下顺序结束u[p]:

C:\Users\userX\Music\Playlists\playlist.wpl\..\..\..\Public\Music\Sample Music\Amanda.wma
C:\Users\userX\Music\Playlists\..\..\Public\Music\Sample Music\Amanda.wma
C:\Users\userX\Music\..\Public\Music\Sample Music\Amanda.wma
C:\Users\userX\Public\Music\Sample Music\Amanda.wma
这是因为PathCombine不在乎路径的任何部分是文件还是目录。这只是一种比较愚蠢的匹配特殊导航字符的方法。和。与实际导航段匹配,形成一条没有这些特殊导航字符的路径


这只是假设playlist.wpl在您的情况下是一个目录名。删除或添加另一个。在相对路径的开头,有一个技巧可以避免删除文件名部分的无关代码,它应该可以正常工作。

当您合并两个字符串时,您会得到以下结果

C:\Users\userX\Music\Playlists\playlist.wpl\..\..\..\Public\Music\Sample Music\Amanda.wma
由于每个..都将删除前面的部分,因此可以按以下顺序结束u[p:

C:\Users\userX\Music\Playlists\playlist.wpl\..\..\..\Public\Music\Sample Music\Amanda.wma
C:\Users\userX\Music\Playlists\..\..\Public\Music\Sample Music\Amanda.wma
C:\Users\userX\Music\..\Public\Music\Sample Music\Amanda.wma
C:\Users\userX\Public\Music\Sample Music\Amanda.wma
这是因为PathCombine不在乎路径的任何部分是文件还是目录。这只是一种比较愚蠢的匹配特殊导航字符的方法。和。与实际导航段匹配,形成一条没有这些特殊导航字符的路径

这只是假设playlist.wpl在您的情况下是一个目录名。将其删除或添加另一个..在相对路径的开头,有一个技巧可以避免删除文件名部分的无关代码,它应该可以正常工作