CMapiAdmin -MAPI 包装器






4.65/5 (16投票s)
2000年1月26日

243895

4777
一个用于封装扩展 MAPI 函数的类。
概述
CMapiAdmin
类包含使使用扩展 MAPI 更加容易的函数。将功能封装在一个类中,减少了编码、研究和初次完成其中一些工作所涉及的学习曲线。下图显示了该类的结构。树中带有与图标关联的键的节点是受保护的函数或成员,并在类内部使用(针对不熟悉 Microsoft Visual C++ IDE 的开发人员进行了解释),因此未“公开”。
深入研究注册表对于仅给定 StoreID
(又名 EntryID
)时能够删除服务至关重要。在源代码中,有一个 CRegistryKey
类,它被 CMapiAdmin
使用。除非你想使用 Win32 注册表函数而不是类,否则它们不能分开。
公共方法
bool GetStorePath(CString strStoreID (in), CString& strStorePath (out))
需要二进制 InformationStoreID
的字符串表示形式。此函数通常用于查找用于“个人文件夹”的 PST 文件的完整路径名。
bool RemoveService(BYTE* pbyEntryID, DWORD dwSize)
需要一个代表 InformationStoreID
的二进制数组。此函数将删除指定存储。这是删除此类服务更准确的方法(请参阅此函数的其他版本)。 尽管如此,我最近发现你可以有多个具有相同 EntryID
(又名 StoreID
)的服务,并且此函数现在会删除所有找到的服务(呃...具有相同的 EntryID
)
bool RemoveService(LPTSTR lpszDisplayName)
需要一个指向包含要删除的服务的显示名称的字符串的指针。此函数将删除所有找到的具有该名称的服务。警告:可能存在多个具有相同名称的服务。
bool GetProfileName(LPTSTR& lpszProfileName)
如果你使用现有会话登录,那么你可能希望确切地知道你正在使用哪个配置文件。
bool CreateMessage(DWORD dwRecipientCount,
LPCTSTR* ppRecipents,
LPCTSTR pMessageSubject,
LPCTSTR pMessageText,
BOOL bHighImportance);
bool CreateNewProfile(LPTSTR lpszNewName)
bool CreateMsgService(LPTSTR lpszService, LPTSTR lpszDisplayName)
bool Logon(ULONG ulUIParam=NULL,
LPTSTR lpszProfileName=NULL,
LPTSTR lpszPassword=NULL,
FLAGS flFlags=NULL);
如果不提供参数,此函数将使用 MapiLogonEx
尝试使用现有会话登录。这种登录方法对于与 Microsoft Outlook 等应用程序一起使用或在其中使用的项目非常有用。
CMapiAdmin 的用法示例
注意: 确保你已经调用了 Co(Un)Initialise()
HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) { MessageBox(0, "CoInitialize Failed", "InitInstance Error", MB_OK); return FALSE; }
和
CoUninitialize();
向单个收件人发送简单消息
CMapiAdmin mapi; if ( mapi.Logon() ) { LPCTSTR ppRecipients[1] = {"jason.hattingh@csfb.com"}; mapi.CreateMessage(1, ppRecipients, "Hello Geezah!", "Here is a test message", TRUE); if (mapi.SendMessage()) AfxMessageBox("Message sent successfully"); }
COM 对象内部的使用示例
有 2 个使用 CMapiAdmin
的示例项目。
Visual Basic 项目 使用 CDO(DLL 包含在 zip 文件中)来显示可用的存储。当用户单击“获取路径”或“删除服务”按钮时,将在 COM 对象(其 Visual C++ 项目 包含在 zip 文件中)中调用相应的函数。
例如,VB 中的以下代码
Private Sub Command1_Click()
Dim cStore As MAPI.InfoStore
Dim sStoreID As String
Set cStore = cStores.Item(List1.ListIndex + 1)
sStoreID = cStore.ID
Dim MsgAdmin As New MessageServiceAdmin
Dim nReturn As Integer
nReturn = MsgAdmin.RemoveByEntryID(sStoreID)
If nReturn = 0 Then
MsgBox "Service Removed Successfully"
Else
MsgBox "Failed to Remove the Service"
End If
End Sub
...与 COM 对象中的以下 C++ 代码(使用 CMapiAdmin
)相关
STDMETHODIMP CMessageServiceAdmin::RemoveByEntryID(VARIANT vEntryID, VARIANT* pvReturn) { AFX_MANAGE_STATE(AfxGetStaticModuleState()) // Start by setting the default return value to S_FALSE: V_VT(pvReturn) = VT_I2; V_I2(pvReturn) = S_FALSE; //////////////////////////////////////////////////////// // CONVERT THE STRING TO A BYTE ARRAY: ...Conversion code here... // END STRING TO BYTE ARRAY CONVERSION ///////////////////////////////////////////////////////////// CMapiAdmin MapiAdmin; if (! MapiAdmin.Logon() ) return S_FALSE; if ( ! MapiAdmin.RemoveService( pByte, (DWORD)nSize ) ) return S_FALSE; // Set the return to ZERO which means all is ok (a non zero normally // represents an error code) V_VT(pvReturn) = VT_I2; V_I2(pvReturn) = S_OK; return S_OK; }