2025-11-28 00:35:46 +09:00

137 lines
4.6 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved
// Application which demonstrates the use of IThumbnailProvider
// to retrieve a thumbnail for an image file.
// This application takes two command line arguments.
// The first argument should be the name of the
// image file to retrieve a thumbnail for, and the second
// argument should be a number indicating the size of the
// thumbnail to retrieve.
#include <windows.h>
#include <shlobj.h>
#include <thumbcache.h>
#include <GdiPlus.h>
HBITMAP g_hThumbnail; // Thumbnail to create
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// The GDI+ objects provide an operator new implementation (in GdiplusBase) and that does
// not throw. Thus clients must check the return value from new rather than catch this failure
// as an exception
Gdiplus::Graphics *pGraphics = new Gdiplus::Graphics(hdc);
if (pGraphics)
{
Gdiplus::Bitmap * pBitmap = Gdiplus::Bitmap::FromHBITMAP(g_hThumbnail, NULL);
if (pBitmap)
{
pGraphics->DrawImage(pBitmap, 0, 0);
delete pBitmap;
}
pBitmap = NULL;
delete pGraphics;
}
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pszCmdLine, int nCmdShow)
{
Gdiplus::GdiplusStartupInput startupInput;
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken, &startupInput, NULL);
int numArgs;
PWSTR *ppszArgs = CommandLineToArgvW(pszCmdLine, &numArgs);
if (ppszArgs && (numArgs == 2))
{
PCWSTR pszSize = ppszArgs[0];
PCWSTR pszFile = ppszArgs[1];
int nSize = _wtoi(pszSize); // Size of thumbnail
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (SUCCEEDED(hr))
{
IShellItem *psi;
hr = SHCreateItemFromParsingName(pszFile, NULL, IID_PPV_ARGS(&psi));
if (SUCCEEDED(hr))
{
IThumbnailProvider *pThumbProvider;
hr = psi->BindToHandler(NULL, BHID_ThumbnailHandler, IID_PPV_ARGS(&pThumbProvider));
if (SUCCEEDED(hr))
{
WTS_ALPHATYPE wtsAlpha;
hr = pThumbProvider->GetThumbnail(nSize, &g_hThumbnail, &wtsAlpha);
if (SUCCEEDED(hr))
{
WNDCLASSEX wcex = { sizeof(wcex) };
wcex.lpfnWndProc = WndProc;
wcex.hInstance = hInstance;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszClassName = L"ThumbnailAppClass";
RegisterClassEx(&wcex);
HWND hWnd = CreateWindowEx(0, wcex.lpszClassName, L"Thumbnail Provider SDK Sample",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
nSize, nSize, NULL, NULL, hInstance, NULL);
if (hWnd)
{
ShowWindow(hWnd, nCmdShow);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
DeleteObject(g_hThumbnail);
}
pThumbProvider->Release();
}
psi->Release();
}
CoUninitialize();
}
}
else
{
MessageBox(NULL, L"Usage: ThumbnailProvider.exe <size> <Absolute Path to file>", L"Wrong number of arguments.", MB_OK);
}
if (ppszArgs)
{
LocalFree(ppszArgs);
}
Gdiplus::GdiplusShutdown(gdiplusToken); // shut down GDIPlus
return 0;
}