65.9K
CodeProject 正在变化。 阅读更多。
Home

CMapiAdmin -MAPI 包装器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.65/5 (16投票s)

2000年1月26日

viewsIcon

243895

downloadIcon

4777

一个用于封装扩展 MAPI 函数的类。

概述

CMapiAdmin 类包含使使用扩展 MAPI 更加容易的函数。将功能封装在一个类中,减少了编码、研究和初次完成其中一些工作所涉及的学习曲线。下图显示了该类的结构。树中带有与图标关联的键的节点是受保护的函数或成员,并在类内部使用(针对不熟悉 Microsoft Visual C++ IDE 的开发人员进行了解释),因此未“公开”。

深入研究注册表对于仅给定 StoreID(又名 EntryID)时能够删除服务至关重要。在源代码中,有一个 CRegistryKey 类,它被 CMapiAdmin 使用。除非你想使用 Win32 注册表函数而不是类,否则它们不能分开。

CMapiAdmin Class Outline

公共方法

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;
}
© . All rights reserved.