79 lines
2.1 KiB
C++
79 lines
2.1 KiB
C++
#define STRICT
|
|
#define UNICODE
|
|
#include <windows.h>
|
|
#include <shlwapi.h>
|
|
#include <shellapi.h>
|
|
#include <stdio.h>
|
|
|
|
#define IID_PPV_ARG(IType, ppType) IID_##IType, reinterpret_cast<void**>(static_cast<IType**>(ppType))
|
|
|
|
HRESULT CoUnmarshalFromCmdLine(LPCTSTR pszCmdLine, REFIID riid, void **ppv)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
*ppv = NULL;
|
|
|
|
pszCmdLine = StrStr(pszCmdLine, TEXT("/DataObject:"));
|
|
if (pszCmdLine)
|
|
{
|
|
pszCmdLine += lstrlen(TEXT("/DataObject:"));
|
|
|
|
char buf[255]; // big enough for standard marshall buffer (which is 68 bytes)
|
|
for (ULONG cb = 0; *pszCmdLine && (cb < sizeof(buf)); cb++)
|
|
{
|
|
buf[cb] = (*pszCmdLine - 'A') + ((*(pszCmdLine + 1) - 'A') << 4);
|
|
if (*(pszCmdLine + 1))
|
|
pszCmdLine += 2;
|
|
else
|
|
break; // odd # of chars in cmd line, error
|
|
}
|
|
|
|
// _asm { int 3 };
|
|
|
|
if (cb < sizeof(buf))
|
|
{
|
|
IStream *pstm;
|
|
hr = CreateStreamOnHGlobal(NULL, TRUE, &pstm);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// fill the marshall stream
|
|
const LARGE_INTEGER li = {0, 0};
|
|
pstm->Write(buf, cb, NULL);
|
|
|
|
// move back to start of stream
|
|
pstm->Seek(li, STREAM_SEEK_SET, NULL);
|
|
|
|
hr = CoUnmarshalInterface(pstm, riid, ppv);
|
|
|
|
pstm->Release();
|
|
}
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
void __cdecl main(void)
|
|
{
|
|
CoInitializeEx(NULL, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE);
|
|
|
|
IDataObject *pdtobj;
|
|
if (SUCCEEDED(CoUnmarshalFromCmdLine(GetCommandLine(), IID_PPV_ARG(IDataObject, &pdtobj))))
|
|
{
|
|
FORMATETC fmte = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
|
|
STGMEDIUM medium;
|
|
|
|
if (SUCCEEDED(pdtobj->GetData(&fmte, &medium)))
|
|
{
|
|
TCHAR szPath[MAX_PATH];
|
|
for (int i = 0; DragQueryFile((HDROP)medium.hGlobal, i, szPath, MAX_PATH); i++)
|
|
{
|
|
MessageBox(NULL, szPath, TEXT("File Name"), MB_OK);
|
|
}
|
|
ReleaseStgMedium(&medium);
|
|
}
|
|
|
|
pdtobj->Release();
|
|
}
|
|
|
|
CoUninitialize();
|
|
}
|