Continuing from Creating a simple pidl: For the times you care enough to send the very fake: Instead of creating a simple pidl, we’ll create a simple shell item.
The idea is the same.
We build a file system bind context containing the information about
the fake file,
and we pass that bind context to the
SHCreateShellItem function.
Take that program that creates a simple pidl and make these changes:
HRESULT CreateSimpleShellItemFromPath(
_In_ const WIN32_FIND_DATAW *pfd,
_In_ PCWSTR pszPath,
_In_ REFIID riid, _Outptr_ void **ppv)
{
*ppv = nullptr;
CComPtr<IBindCtx> spbc;
HRESULT hr = CreateFileSysBindCtx(pfd, &spbc);
if (SUCCEEDED(hr)) {
hr = SHCreateItemFromParsingName(pszPath, spbc, riid, ppv);
}
return hr;
}
void DoStuffWith(_In_ IShellItem2 *psi2)
{
// Print the file name
PCWSTR pszName;
if (SUCCEEDED(psi2->GetDisplayName(
SIGDN_DESKTOPABSOLUTEPARSING,
&pszName)) {
wprintf(L"Path is \"%ls\"\n", pszName);
CoTaskMemFree(pszName);
}
// Print the file size
ULONGLONG ullSize;
if (SUCCEEDED(psi2->GetUInt64(PKEY_Size, &ullSize))) {
wprintf(L"Size is %I64u\n", ullSize);
}
}
int __cdecl wmain(int argc, PWSTR argv[])
{
CCoInitialize init;
if (SUCCEEDED(init)) {
WIN32_FIND_DATAW fd = {};
fd.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
fd.nFileSizeLow = 42;
CComPtr<IShellItem2> spsi2;
if (SUCCEEDED(CreateSimpleShellItemFromPath(&fd,
L"Q:\\Whatever.txt", IID_PPV_ARGS(&spsi2)))) {
DoStuffWith(spsi2);
}
}
return 0;
}
Instead of creating a simple pidl,
we create a simple shell item
and then extract the same information from it it as before,
just doing it the
IShellItem way.
0 comments