⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngmapi.cpp

📁 ResOrg 图形化管理Vc项目的资源ID的工具的源代码。 ResOrg - Manage and Renumber Resource Symbol IDs Introduction The
💻 CPP
字号:
/*
 *	$Header: /MindProbe/IMapi.cpp 38    11/03/98 2:10p Admin $
 *
 *	$Log: /MindProbe/IMapi.cpp $
 * 
 * 38    11/03/98 2:10p Admin
 * Added jackpot and gambit.  Removed random player selection.  Added part
 * of MPede support.  Added response to ChatgamesID request.  Added code
 * to track server name.
 */
#include "StdAfx.h"

#include <mapi.h>

#include "NGMapi.h"


HINSTANCE CNGMapi::m_hInstMail = (HINSTANCE) NULL;
BOOL	  CNGMapi::m_isMailAvail = (BOOL) -1;


CNGMapi::CNGMapi()
{
	m_error = 0;										//	Initially error free
	m_uError = 0;

	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 (m_lpfnSendMail == NULL)
	{
		AfxMessageBox(AFX_IDP_INVALID_MAPI_DLL);
		m_error = IMAPI_INVALIDDLL;
		return;
	}

	ASSERT(m_lpfnSendMail != NULL);
}

CNGMapi::~CNGMapi()
{
	if (m_hInstMail != (HINSTANCE) NULL)
		::FreeLibrary(m_hInstMail);

	m_hInstMail = (HINSTANCE) NULL;
	
	free(m_message.lpFiles);
	free(m_message.lpRecips);
}

BOOL CNGMapi::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 CNGMapi::Error()
{
	UINT temp = m_error;

	m_error = IMAPI_SUCCESS;
	return temp;
}

BOOL CNGMapi::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 CNGMapi::To(LPCTSTR recip)
{
	if (AllocNewTo())
	{
		//	We succeeded in allocating a new recipient record
		m_message.lpRecips[m_message.nRecipCount].lpszName = (LPTSTR) malloc(strlen(recip) + 1);
		strcpy(m_message.lpRecips[m_message.nRecipCount].lpszName, recip);
		m_message.lpRecips[m_message.nRecipCount].ulRecipClass = MAPI_TO;
		m_message.nRecipCount++;
		return TRUE;
	}

	m_error = IMAPI_FAILTO;
	return FALSE;
}

BOOL CNGMapi::Cc(LPCTSTR recip)
{
	if (AllocNewTo())
	{
		//	We succeeded in allocating a new recipient record
		m_message.lpRecips[m_message.nRecipCount].lpszName = (LPTSTR) malloc(strlen(recip) + 1);
		strcpy(m_message.lpRecips[m_message.nRecipCount].lpszName, recip);
		m_message.lpRecips[m_message.nRecipCount].ulRecipClass = MAPI_CC;
		m_message.nRecipCount++;
		return TRUE;
	}

	m_error = IMAPI_FAILCC;
	return FALSE;
}

BOOL CNGMapi::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) malloc(strlen(path) + 1);
	strcpy(m_message.lpFiles[m_message.nFileCount].lpszPathName, path);

	if (name != (LPCTSTR) NULL)
	{
		m_message.lpFiles[m_message.nFileCount].lpszFileName = (LPTSTR) malloc(strlen(name) + 1);
		strcpy(m_message.lpFiles[m_message.nFileCount].lpszFileName, name);
	}

	m_message.nFileCount++;
	return TRUE;
}


ULONG CNGMapi::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);

	//	Now free malloced recipients
	for (i = 0; i < m_message.nRecipCount; i++)
		free(m_message.lpRecips[i].lpszName);

	//	Then free malloced attachments
	for (i = 0; i < m_message.nFileCount; i++)
	{
		free(m_message.lpFiles[i].lpszPathName);
		free(m_message.lpFiles[i].lpszFileName);
	}

	if (nError != SUCCESS_SUCCESS && nError != MAPI_USER_ABORT && nError != MAPI_E_LOGIN_FAILURE)
	{
		AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND);
//		return FALSE;
	}

//	return TRUE;
	m_uError = nError;
	return nError;
}


CString CNGMapi::GetLastError(void) const
{
	CString sMsg;
	switch (m_uError)
	{
		case MAPI_E_AMBIGUOUS_RECIPIENT:
			sMsg = _T("A recipient matched more than one of the recipient descriptor structures and MAPI_DIALOG was not set. No message was sent.");
			break;

		case MAPI_E_ATTACHMENT_NOT_FOUND: 
			sMsg = _T("The specified attachment was not found. No message was sent.");
			break;

		case MAPI_E_ATTACHMENT_OPEN_FAILURE:
			sMsg = _T("The specified attachment could not be opened. No message was sent.");
			break;

		case MAPI_E_BAD_RECIPTYPE:
			sMsg = _T("The type of a recipient was not MAPI_TO, MAPI_CC, or MAPI_BCC. No message was sent.");
			break;

		case MAPI_E_FAILURE:
			sMsg = _T("One or more unspecified errors occurred. No message was sent.");
			break;

		case MAPI_E_INSUFFICIENT_MEMORY:
			sMsg = _T("There was insufficient memory to proceed. No message was sent.");
			break;

		case MAPI_E_INVALID_RECIPS:
			sMsg = _T("One or more recipients were invalid or did not resolve to any address.");
			break;

		case MAPI_E_LOGIN_FAILURE:
			sMsg = _T("There was no default logon, and the user failed to log on successfully when the logon dialog box was displayed. No message was sent.");
			break;

		case MAPI_E_TEXT_TOO_LARGE: 
			sMsg = _T("The text in the message was too large. No message was sent.");
			break;

		case MAPI_E_TOO_MANY_FILES:
			sMsg = _T("There were too many file attachments. No message was sent.");
			break;

		case MAPI_E_TOO_MANY_RECIPIENTS:
			sMsg = _T("There were too many recipients. No message was sent.");
			break;

		case MAPI_E_UNKNOWN_RECIPIENT:
			sMsg = _T("A recipient did not appear in the address list. No message was sent.");
			break;

		case MAPI_E_USER_ABORT:
			sMsg = _T("The user canceled one of the dialog boxes. No message was sent");
			break;

		case SUCCESS_SUCCESS:
			sMsg = _T("The message was sent successfully");
			break;

		default:
			sMsg = _T("Unknown error");
			break;
	}
	return sMsg;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -