使用与ShgetFolderPath的数组

Using an array with SHGetFolderPath

本文关键字:数组 ShgetFolderPath      更新时间:2023-10-16

我的代码是:

int copyme() {
    TCHAR buf[MAX_PATH];
    TCHAR szPath[MAX_PATH];
    std::array<std::string, 16> locations = { "CSIDL_APPDATA","CSIDL_CDBURN_AREA","CSIDL_COMMON_APPDATA","CSIDL_COMMON_DESKTOPDIRECTORY","CSIDL_COMMON_DOCUMENTS","CSIDL_COMMON_MUSIC","CSIDL_COMMON_PICTURES","CSIDL_COMMON_PROGRAMS","CSIDL_COMMON_STARTMENU","CSIDL_COMMON_STARTUP","CSIDL_COMMON_TEMPLATES","CSIDL_COMMON_VIDEO","CSIDL_DESKTOPDIRECTORY","CSIDL_INTERNET_CACHE","CSIDL_LOCAL_APPDATA","CSIDL_PERSONAL", };
    for (auto& location : locations) {
        (SHGetFolderPath(NULL,
            location | CSIDL_FLAG_CREATE,
            NULL,
            0,
            szPath)
    }

我试图从数组中调用SHGetFolderPath,但根据文档:

nfolder [in]

类型:int

a csidl值,标识要检索路径的文件夹。只有实际文件夹是有效的。如果指定了虚拟文件夹,则此功能失败。您可以通过将文件夹的CSIDL与CSIDL_FLAG_CREATE组合来强制创建文件夹。

因此,只能使用int。有什么想法我能做什么?

,因为SHGetFolderPath文档明确指出,nFolder参数是整数,而不是字符串。CSIDL值是数字ID,而不是字符串(其可读的名称是#define'D中的shlobj.h)。

所以,只需将您的数组从std::string更改为int,然后删除CSIDL名称周围的引用字符:

int copyme()
{
    TCHAR szPath[MAX_PATH];
    std::array<int, 16> locations = {
        CSIDL_APPDATA, CSIDL_CDBURN_AREA, CSIDL_COMMON_APPDATA, CSIDL_COMMON_DESKTOPDIRECTORY,
        CSIDL_COMMON_DOCUMENTS, CSIDL_COMMON_MUSIC, CSIDL_COMMON_PICTURES, CSIDL_COMMON_PROGRAMS,
        CSIDL_COMMON_STARTMENU, CSIDL_COMMON_STARTUP, CSIDL_COMMON_TEMPLATES, CSIDL_COMMON_VIDEO,
        CSIDL_DESKTOPDIRECTORY, CSIDL_INTERNET_CACHE, CSIDL_LOCAL_APPDATA, CSIDL_PERSONAL};
    for (auto location : locations)
    {
        SHGetFolderPath(NULL,
            location | CSIDL_FLAG_CREATE,
            NULL,
            0,
            szPath);
    }