Code:
#include <shlobj.h>
#include <stdio.h>
#include <wchar.h>
#include <tchar.h>
#define SAFE_RELEASE(pObj) if (pObj) { (pObj)->lpVtbl->Release(pObj); (pObj) = NULL; }
#define SAFE_MALLOC_FREE(pv) if (pv) { IMallocFree(pv); (pv) = NULL; }
#define HR_TRY(func) if (FAILED(func)) { printf("Error: %s\n", #func); goto cleanup; }
VOID IMallocFree(LPVOID pv)
{
static IMalloc * pMalloc;
if (!pMalloc) SHGetMalloc(&pMalloc);
if (pMalloc) pMalloc->lpVtbl->Free(pMalloc, pv);
}
HRESULT CreateThumbnail(LPOLESTR szPath, LPOLESTR szFile, DWORD dwWidth, DWORD dwHeight, HBITMAP * pThumbnail)
{
LPITEMIDLIST pidlURL = NULL,
pidlWorkDir = NULL;
DWORD dwPriority = 0,
dwFlags = IEIFLAG_ASPECT;
HRESULT hr;
SIZE size;
WCHAR szBuffer[MAX_PATH];
IExtractImage * peiURL = NULL;
IShellFolder * psfWorkDir = NULL;
IShellFolder * psfDesktop = NULL;
CoInitialize(NULL);
size.cx = dwWidth;
size.cy = dwHeight;
HR_TRY(hr = SHGetDesktopFolder(&psfDesktop));
HR_TRY(hr = psfDesktop->lpVtbl->ParseDisplayName(psfDesktop, NULL, NULL, szPath, NULL, &pidlWorkDir, NULL));
HR_TRY(hr = psfDesktop->lpVtbl->BindToObject(psfDesktop, pidlWorkDir, NULL, &IID_IShellFolder, &psfWorkDir));
HR_TRY(hr = psfWorkDir->lpVtbl->ParseDisplayName(psfWorkDir, NULL, NULL, szFile, NULL, &pidlURL, NULL));
HR_TRY(hr = psfWorkDir->lpVtbl->GetUIObjectOf(psfWorkDir, NULL, 1, &pidlURL, &IID_IExtractImage, NULL, &peiURL));
HR_TRY(hr = peiURL->lpVtbl->GetLocation(peiURL, szBuffer, MAX_PATH, &dwPriority, &size, 16, &dwFlags));
HR_TRY(hr = peiURL->lpVtbl->Extract(peiURL, pThumbnail));
cleanup:
SAFE_MALLOC_FREE(pidlWorkDir);
SAFE_MALLOC_FREE(pidlURL);
SAFE_RELEASE(peiURL);
SAFE_RELEASE(psfDesktop);
SAFE_RELEASE(psfWorkDir);
CoUninitialize();
return hr;
}
int main(void)
{
HRESULT hr;
HBITMAP hBitmap;
if (FAILED(
hr = CreateThumbnail(L"C:\\Documents and Settings\\User\\My Documents\\",
L"test.gif", 120, 120, &hBitmap)
))
{
TCHAR msg[256];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, hr, LANG_USER_DEFAULT, msg, 256, NULL);
_tprintf(_T("hr = %x, msg = %s\n"), hr, msg);
}
else
{
HDC hdc = CreateCompatibleDC(NULL);
HBITMAP hOld = SelectObject(hdc, hBitmap);
BitBlt(GetDC(NULL), 0, 0, 120, 120, hdc, 0, 0, SRCCOPY);
SelectObject(hdc, hOld);
DeleteDC(hdc);
DeleteObject(hBitmap);
}
getchar();
return 0;
}