#define STRICT #define UNICODE #include #include #include #include #define IID_PPV_ARG(IType, ppType) IID_##IType, reinterpret_cast(static_cast(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(); }