VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 830|回复: 6

SHBrowseForFolder的初始路径如何可以设置为系统temp目录

[复制链接]

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-29 00:20:01 | 显示全部楼层 |阅读模式
如题,回调函数中在BFFM_INITIALIZED消息中初始化默认目录:
SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)"d:\\aaa\\");
可以正确实现,但如果默认目录是用GetTempPath获得的系统temp目录,就无法实现。估计的原因是到达系统temp目录会有隐藏目录。
回复

使用道具 举报

0

主题

21

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-3-8 17:45:01 | 显示全部楼层
use SHGetSpecialLocaion to get the pidl of temp path and pass it to the dialog
回复

使用道具 举报

0

主题

45

帖子

32.00

积分

新手上路

Rank: 1

积分
32.00
发表于 2020-3-22 13:30:01 | 显示全部楼层
CString GetSpecialPath(int CSIDL)
{
   LPITEMIDLIST pidl;
   CString str = "";
   HRESULT r = SHGetSpecialFolderLocation(0,CSIDL,&pidl);
   if(r == NOERROR)
   {
      TCHAR szPath[INFO_BUFFER_SIZE];
      if(SHGetPathFromIDList(pidl,szPath))
      {
         str = CString(szPath);
      }
   }
   return str;
}
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-7-23 19:00:01 | 显示全部楼层
谢谢楼上的,但是在shlobj.h中没有找到系统temp目录的CSIDL值。
还请指点一下。
回复

使用道具 举报

0

主题

45

帖子

32.00

积分

新手上路

Rank: 1

积分
32.00
发表于 2020-7-28 11:15:01 | 显示全部楼层
你是说的\Windows\Temp目录么

GetWindowsDirectory然后再手工加上去好了
回复

使用道具 举报

0

主题

45

帖子

32.00

积分

新手上路

Rank: 1

积分
32.00
发表于 2020-7-28 12:00:02 | 显示全部楼层
或者用环境变量吧

ExpandEnvironmentStrings

GetTempPath应该不会有问题的吧 用GetLastError看下是什么错误
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-7-31 16:15:01 | 显示全部楼层
可能是我的问题描述的不很清楚。代码如下:

static TCHAR szdir[MAX_PATH];
INT CALLBACK BrowseCallbackProc(HWND hwnd,
                                UINT uMsg,
                                LPARAM lp,
                                LPARAM pData)
{       
        DWORD dwResult;   
               
        switch(uMsg)
        {
        case BFFM_INITIALIZED:
                // WParam is TRUE since you are passing a path.
                // It would be FALSE if you were passing a pidl.                       
                dwResult = ExpandEnvironmentStrings(
                        "%TMP%",
                        TempDirectory,
                        MAX_PATH);          // 1111
                MessageBox(NULL,TempDirectory,NULL,MB_OK);
               
                GetTempPath(MAX_PATH,TempDirectory); // 2222
                MessageBox(NULL,TempDirectory,NULL,MB_OK);                
                SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)TempDirectory);
                break;
               
        case BFFM_SELCHANGED:
                // Set the status window to the currently selected path.
                if (SHGetPathFromIDList((LPITEMIDLIST) lp ,szdir))
                {
                        SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szdir);
                }
                break;               
        }
        return 0;
}

int BrowseForFolder(int first)
{
        LPITEMIDLIST pidlSelected = NULL;
        BROWSEINFO bi = {0};
        LPMALLOC pMalloc = NULL;
       
        SHGetMalloc(&pMalloc);
        ZeroMemory(&bi,sizeof(bi));
        bi.hwndOwner = NULL;
        bi.pidlRoot = NULL;
        bi.pszDisplayName = 0;
        if (first)
                bi.lpszTitle = "Setting temp folder, you may change it from menu.";
        else
                bi.lpszTitle = "Change Temp Directory";
        bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
        bi.lpfn = BrowseCallbackProc;
        bi.lParam = 0;
       
        pidlSelected = SHBrowseForFolder(&bi);       
       
        if (!pidlSelected)
                return 1; // user selected cancel
       
        pMalloc->lpVtbl->Free(pMalloc,pidlSelected);
        pMalloc->lpVtbl->Release(pMalloc);

        return 0;
}

现在浏览文件夹窗口打开后默认焦点在“我的电脑”上,系统盘C盘是打开状态的,但是没有默认选中系统temp目录(即TempDirectory)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表