www.pudn.com > afdialer_src.rar > IMapi.cpp
/* * $Header:$ * * $Log:$ */ #include "stdafx.h" #include#include "imapi.h" HINSTANCE CIMapi::m_hInstMail = (HINSTANCE) NULL; BOOL CIMapi::m_isMailAvail = (BOOL) -1; CIMapi::CIMapi() { m_error = 0; // Initially error free memset(&m_message, 0, sizeof(MapiMessage)); memset(&m_from, 0, sizeof(MapiRecipDesc)); m_message.lpOriginator = &m_from; m_from.ulRecipClass = MAPI_ORIG; if (m_hInstMail == (HINSTANCE) NULL) // Load the MAPI dll m_hInstMail = ::LoadLibraryA("MAPI32.DLL"); if (m_hInstMail == (HINSTANCE) NULL) { AfxMessageBox(AFX_IDP_FAILED_MAPI_LOAD); m_error = IMAPI_LOADFAILED; return; } ASSERT(m_hInstMail != (HINSTANCE) NULL); // Now get the pointer to the send function (FARPROC&) m_lpfnSendMail = GetProcAddress(m_hInstMail, "MAPISendMail"); if (NULL == m_lpfnSendMail) { AfxMessageBox(AFX_IDP_INVALID_MAPI_DLL); m_error = IMAPI_INVALIDDLL; return; } ASSERT(m_lpfnSendMail != NULL); } CIMapi::~CIMapi() { if (m_hInstMail != (HINSTANCE) NULL) ::FreeLibrary(m_hInstMail); m_hInstMail = (HINSTANCE) NULL; free(m_message.lpFiles); free(m_message.lpRecips); } BOOL CIMapi::HasEmail() { if (m_isMailAvail == (BOOL) -1) m_isMailAvail = ::GetProfileInt(_T("MAIL"), _T("MAPI"), 0) != 0 && SearchPath(NULL, _T("MAPI32.DLL"), NULL, 0, NULL, NULL) != 0; return m_isMailAvail; } UINT CIMapi::Error() { UINT temp = m_error; m_error = IMAPI_SUCCESS; return temp; } BOOL CIMapi::AllocNewTo() { // Allocate a new MapiRecipDesc structure and initialise it to all zeros m_message.lpRecips = (MapiRecipDesc *) realloc(m_message.lpRecips, (m_message.nRecipCount + 1) * sizeof(MapiRecipDesc)); memset(&m_message.lpRecips[m_message.nRecipCount], 0, sizeof(MapiRecipDesc)); ASSERT(m_message.lpRecips); return m_message.lpRecips != (MapiRecipDesc *) NULL; } BOOL CIMapi::To(LPCTSTR recip) { if (AllocNewTo()) { // We succeeded in allocating a new recipient record m_message.lpRecips[m_message.nRecipCount].lpszName = (LPTSTR) recip; m_message.lpRecips[m_message.nRecipCount].ulRecipClass = MAPI_TO; m_message.nRecipCount++; return TRUE; } m_error = IMAPI_FAILTO; return FALSE; } BOOL CIMapi::Cc(LPCTSTR recip) { if (AllocNewTo()) { // We succeeded in allocating a new recipient record m_message.lpRecips[m_message.nRecipCount].lpszName = (LPTSTR) recip; m_message.lpRecips[m_message.nRecipCount].ulRecipClass = MAPI_CC; m_message.nRecipCount++; return TRUE; } m_error = IMAPI_FAILCC; return FALSE; } BOOL CIMapi::Attach(LPCTSTR path, LPCTSTR name) { // Add a new attachment record m_message.lpFiles = (MapiFileDesc *) realloc(m_message.lpFiles, (m_message.nFileCount + 1) * sizeof(MapiFileDesc)); memset(&m_message.lpFiles[m_message.nFileCount], 0, sizeof(MapiFileDesc)); ASSERT(m_message.lpFiles); if (m_message.lpFiles == (MapiFileDesc *) NULL) { m_error = IMAPI_FAILATTACH; return FALSE; } m_message.lpFiles[m_message.nFileCount].lpszPathName = (LPTSTR) path; m_message.lpFiles[m_message.nFileCount].lpszFileName = (LPTSTR) name; m_message.nFileCount++; return TRUE; } BOOL CIMapi::Send(ULONG flags) { CWaitCursor wait; int offset = m_text.GetLength(); // Add 1 space per attachment at the end of the body text. m_text += CString(' ', m_message.nFileCount); // Set each attachment to replace one of the added spaces at the end of the body text. for (UINT i = 0; i < m_message.nFileCount; i++) m_message.lpFiles[i].nPosition = offset++; m_message.lpszNoteText = (LPTSTR) (LPCTSTR) m_text; // Set the body text // prepare for modal dialog box AfxGetApp()->EnableModeless(FALSE); HWND hWndTop; CWnd* pParentWnd = CWnd::GetSafeOwner(NULL, &hWndTop); // some extra precautions are required to use MAPISendMail as it // tends to enable the parent window in between dialogs (after // the login dialog, but before the send note dialog). pParentWnd->SetCapture(); ::SetFocus(NULL); pParentWnd->m_nFlags |= WF_STAYDISABLED; int nError = m_lpfnSendMail(0, (ULONG) pParentWnd->GetSafeHwnd(), &m_message, MAPI_LOGON_UI | flags, 0); // after returning from the MAPISendMail call, the window must // be re-enabled and focus returned to the frame to undo the workaround // done before the MAPI call. ::ReleaseCapture(); pParentWnd->m_nFlags &= ~WF_STAYDISABLED; pParentWnd->EnableWindow(TRUE); ::SetActiveWindow(NULL); pParentWnd->SetActiveWindow(); pParentWnd->SetFocus(); if (hWndTop != NULL) ::EnableWindow(hWndTop, TRUE); AfxGetApp()->EnableModeless(TRUE); if (nError != SUCCESS_SUCCESS && nError != MAPI_USER_ABORT && nError != MAPI_E_LOGIN_FAILURE) { AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND); return FALSE; } return TRUE; }