如何获得 window shell文件夹缩略图

本文介绍了一种在Shell编程中解析文件路径的方法,并通过示例代码详细展示了如何从桌面根节点开始操作,找到目标文件夹及文件的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


这个问题关系到 shell接口编程部分,一个比较令人纠结的问题时,不管操作那个部分的文件夹,都要从shell文件系统的root节点(Desktop)开始操作,直到找到你要的节点位置。概因树形结构表达有关。
不说了,直接上代码吧:


LPITEMIDLIST pidlItems = NULL, pidlURL = NULL, pidlWorkDir = NULL; 
    ULONG   ulParseLen = 0;
    HRESULT hr; 
    TCHAR pszPath[MAX_PATH*2]; 
    DWORD dwPriority = 0, dwFlags = IEIFLAG_SCREEN; 
    SIZE size = { dwWidth, dwHeight }; 
    IExtractImage* peiURL = NULL;    // interface is used to request a thumbnail image from a Shell folder
    IShellFolder* psfDesktop = NULL; 
    IShellFolder* psfWorkDir = NULL; 
    IMalloc*              pMalloc = NULL;

    TString TempTumbnail = GetMediaLibraryDefaultDir() + _T( "MLThumbnail.jpg" );

    CImage myImage;

    TString wsDir,wsFile,wsTempFile; 

    BOOL bComInit = TRUE;
    hr = CoInitialize( NULL );


    hr = SHGetMalloc( &pMalloc );
    hr = SHGetDesktopFolder(&psfDesktop); 


    wsDir = LocalFile;
    wsDir.erase(wsDir.find_last_of(_T( '\\' )) + 1, wsDir.length());
    wsFile = LocalFile;
    wsFile.erase(0, wsFile.find_last_of(_T( '\\' )) + 1);

    // get working directory 
    TCHAR m_wsBuffer[255];
    _tcscpy_s(m_wsBuffer,wsDir.c_str());
    // ParseDisplayName:Translates a file object's or folder's display name into an item identifier list.
    hr = psfDesktop->ParseDisplayName(NULL, NULL, m_wsBuffer, &ulParseLen, &pidlWorkDir, NULL); 
    hr = psfDesktop->BindToObject(pidlWorkDir, NULL, IID_IShellFolder, (LPVOID*)&psfWorkDir); 

    psfDesktop->Release(); 
    psfDesktop = NULL; 
    pMalloc->Free(pidlWorkDir); 
    pidlWorkDir = NULL; 

    // retrieve link information 
    _tcscpy_s(m_wsBuffer,wsFile.c_str()); 
    hr = psfWorkDir->ParseDisplayName(NULL, NULL, m_wsBuffer, &ulParseLen, &pidlURL, NULL); 

    // query IExtractImage 
    hr = psfWorkDir->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*)&pidlURL, IID_IExtractImage, NULL, (LPVOID*)&peiURL); 

    // define thumbnail properties 
    hr = peiURL->GetLocation(pszPath, MAX_PATH*2, &dwPriority, &size, 16, &dwFlags); 

    // generate thumbnail 
    HBITMAP  hThumbnail= NULL;
    hr = peiURL->Extract(&hThumbnail); 

    // clean-up IExtractImage 
    peiURL->Release(); 
    peiURL = NULL; 

    myImage.Attach(hThumbnail);
    myImage.Save(TempTumbnail.c_str());


    // free allocated structures 
    if (peiURL != NULL) peiURL->Release(); 
    if (pidlURL != NULL) pMalloc->Free(pidlURL); 
    if (pidlWorkDir != NULL) pMalloc->Free(pidlWorkDir); 
    if (psfDesktop != NULL) psfDesktop->Release(); 
    if (psfWorkDir != NULL) psfWorkDir->Release(); 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值