Implementing “Sent To Mail Recipient”; in your Application
I wanted to be able to easily email a file from a utility I wrote, and thought “wouldn’t it be so much easier if I could incorporate the ‘Sent To Mail Receipient’ functionality available within Windows” so I didn’t have to worry about which email application is actually installed. I know this will typically limit this to either Microsoft Outlook Express or Microsoft Outlook, but at least I don’t have to worry about the mechanism required to create an email with an attachment which is yet to be sent.
So the following is the C++ code which implements createEmailWithAttachment().
The GetUIObjectOfFile() routine is taken from Raymand Chen’s blog where he posted How to host an IContextMenu, part 1.
The droptarget code was taken from a discussion thread which was incomplete.
Unicode and non-unicode variants are supported.
HRESULT GetUIObjectOfFile(HWND hwnd, LPCWSTR pszPath, REFIID riid, void **ppv) { *ppv = NULL; HRESULT hr; LPITEMIDLIST pidl; SFGAOF sfgao; hr = SHParseDisplayName(pszPath, NULL, &pidl, 0, &sfgao); if (SUCCEEDED(hr)) { IShellFolder *psf; LPCITEMIDLIST pidlChild; hr = SHBindToParent(pidl, IID_IShellFolder, (void**)&psf, &pidlChild); if (SUCCEEDED(hr)) { hr = psf->GetUIObjectOf(hwnd, 1, &pidlChild, riid, NULL, ppv); psf->Release(); } CoTaskMemFree(pidl); } return hr; } #ifdef DEFINE_GUID #undef DEFINE_GUID #endif #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) EXTERN_C const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } DEFINE_GUID(CLSID_SendMail, 0x9E56BE60, 0xC50F, 0x11CF, 0x9A, 0x2C, 0x00, 0xA0, 0xC9, 0x0A, 0x90, 0xCE); static HRESULT createEmailWithAttachment(LPCTSTR pszFileName) { IDataObject *pDataObject = NULL; IDropTarget *pDropTarget = NULL; LPCWSTR pwszFileName = NULL; bool bCreated = false; HRESULT hr; #ifdef UNICODE pwszFileName = pszFileName; #else WCHAR *pwszBuffer = NULL; int nLength = MultiByteToWideChar(CP_ACP, 0, pszFileName, strlen(pszFileName), NULL, 0); if (nLength DragEnter(pDataObject, MK_LBUTTON, pt, &dwEffect); if (SUCCEEDED(hr)) { hr = pDropTarget->Drop(pDataObject, MK_LBUTTON, pt, &dwEffect); if (SUCCEEDED(hr)) bCreated = true; } pDropTarget->Release(); } #ifndef UNICODE free(pwszBuffer); #endif // UNICODE pDataObject->Release(); } return hr; }Sphere: Related Content