SHGetFolderPath不推荐使用:什么是检索Windows文件夹路径的替代方法?

use*_*004 7 c++ windows winapi known-folders

SHGetFolderPath()从Windows Vista开始不推荐使用该功能:http://msdn.microsoft.com/en-us/library/bb762181%28v=VS.85%29.aspx

在Windows中检索应用程序文件夹路径的另一种方法是什么?

SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath)
Run Code Online (Sandbox Code Playgroud)

除此之外,为什么我在使用这个函数时会遇到这些错误:

Error   1   error C2065: 'CSIDL_COMMON_APPDATA' : undeclared identifier 

Error   2   error C3861: 'SHGetFolderPath': identifier not found
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 12

您链接的文档中描述了替代方法.即它是SHGetKnownFolderPath.

但是,SHGetKnownFolderPath仅适用于Vista或更高版本.因此,如果您使用加载时链接,并运行调用SHGetKnownFolderPathXP 的程序,那么该程序将无法启动.如果您希望支持XP,这显然是一个问题.

现在,您可以切换到运行时链接SHGetKnownFolderPath.在调用之前进行版本检查,如果该功能不可用,则返回SHGetFolderPath.

就个人而言,我不会让这种弃意过度担心你.Microsoft以保持向后兼容性而闻名.不要指望SHGetFolderPath很快就会消失.你会发现它SHGetFolderPath存在于Windows 8中,我希望它仍然存在于现在10年后的任何Windows中.我的建议是坚持加载时间链接,只有SHGetKnownFolderPath当你放弃支持XP 时才切换到.

你在编辑中提出的另一个问题是如何打电话SHGetFolderPath.您需要遵守在您的问题中链接到的MSDN文档主题底部的要求.具体来说,包括Shlobj.h并传递Shlobj.lib给链接器.

  • 这是一个完全不同的问题.我更新了答案以涵盖它,但我建议您将来一次保留一个问题. (2认同)