HOWTO: Use Active Messaging to Work with Public/Personal Folders

Last reviewed: November 21, 1997
Article ID: Q171638
The information in this article applies to:
  • Collaboration Data Objects (CDO), version 1.1
  • Microsoft Visual Basic Standard and Professional Editions, 32-bit only, for Windows, version 4.0
  • Microsoft Visual Basic Learning, Professional, and Enterprise Editions for Windows, version 5.0

SUMMARY

To navigate to folders in Active Messaging you need to know either the FolderID or the name of the folder and where it is. This example assumes that you do not know the FolderID, but that you do know what folder you are looking for, and where it is located. For purposes of demonstration, this example assumes that the folder you are looking for is in your local PST (Personal Folders).

MORE INFORMATION

To navigate to a folder that is not built into the session object (that is, Inbox or Outbox), you need to know something about the folder. For example, if you know the FolderID, then you can use the GetFolder method of the session object. The problem with this method is that you do not always know the FolderID, which is a string that specifies the unique identifier of the folder.

A folder's unique identifier comes from MAPI, which assigns a permanent, unique identifier when an object is created. This identifier does not change from one MAPI session to another, nor from one messaging domain to another.

If you know only the folder's location and name, you must navigate to the folder. One way to accomplish this is to iterate through the InfoStores until you find the one that contains your folder. Then iterate through the folders in the InfoStore to find your target folder.

Each InfoStore contains a RootFolder. By identifying the RootFolder's name, you know what type of InfoStore you are in. Use the following table to determine where in the hierarchy you are:

   INFOSTORE.NAME            TOPFOLDER.NAME
   Public Folders            IPM_SUBTREE
   Mailbox - <User Name>     Top of Information Store
   PST                       Top of Personal Folders

Using the above table, you know that if you want to find the folder named "Messaging" in the PST, you need to find a TopFolder named "Top of Personal Folders". Then, navigate through these folders until you find the "Messaging" folder.

One problem with this method is that you can have multiple PST files in a profile. If this is the case, you need to employ an additional check to make sure you are in the correct PST. Alternatively, you can check for the name of the InfoStore instead of the name of the Root Folder.

The following code demonstrates how to use this technique.

This code sample requires a reference to the "Microsoft Active Messaging 1.1 Object Library" (Olemsg32.dll). This sample assumes that there is an active client session running.

   Option Explicit
   Dim objSession As MAPI.Session

   Private Sub Form_Load()
      Set objSession = CreateObject("MAPI.Session")
      objSession.Logon showdialog:=False, newsession:=False
   End Sub
   Private Sub Command1_Click()
      Dim objPSTFolder As Folder
      Dim objMessages As Messages
      Dim objOneMessage As Message

      'Want to find the Messaging folder in my PST. Modify the "Messaging"
      'as needed to find the folder you are interested in.
      Set objPSTFolder = objFindTargetFolder("Top of Personal Folders", _
                                             "Messaging")
      Set objMessages = objPSTFolder.Messages
      Set objOneMessage = objMessages.GetFirst
   End Sub
   Private Function objFindTargetFolder( _
      strTargetTopFolder As String, _
      strSearchName As String) As Folder

      Dim objInfoStores As InfoStores
      Dim objInfoStore As InfoStore
      Dim objTopFolder As Folder
      Dim objPSTFolders As Folders
      Dim i As Integer

      Set objInfoStores = objSession.InfoStores
      'This message box loop is just telling you what the current
      'objects are. It is not needed for the function to work
      'properly.
      For i = 1 To objInfoStores.Count
         Set objInfoStore = objInfoStores(i)
         Set objTopFolder = objInfoStore.RootFolder
         MsgBox "i= " & i & Chr(10) & _
              "InfoStore.Name= " & objInfoStores(i).Name & Chr(10) & _
              "TopFolder.Name= " & objTopFolder.Name
      Next i

      'This loop finds the TopFolder you specified.
      For i = 1 To objInfoStores.Count
         Set objInfoStore = objInfoStores(i)
         Set objTopFolder = objInfoStore.RootFolder
         If objTopFolder.Name = strTargetTopFolder Then 'Found PST
            'Because you can have more than one PST in a profile,
            'you may want to put another check here to make sure you have
            'the correct PST. This check would need to specify a string
            'that is the name of the PST you are looking for.
            'It would look something like this:
            'If objInfoStore.Name = "MyPST" Then 'Found own PST
            '   Exit For
            'End If
         End If
      Next i
      Set objPSTFolders = objTopFolder.Folders
      For i = 1 To objPSTFolders.Count
         MsgBox objPSTFolders.Item(i).Name
         If objPSTFolders.Item(i).Name = strSearchName Then
            Exit For
         End If
      Next i
      Set objFindTargetFolder = objPSTFolders.Item(i)
      Set objTopFolder = Nothing
      Set objPSTFolders = Nothing
      Set objInfoStores = Nothing
      Set objInfoStore = Nothing
   End Function

REFERENCES

For additional information about Collaboration Data Objects versus Active Messaging, please see the following article in the Microsoft Knowledge Base:

   ARTICLE-ID: Q176916
   TITLE     : INFO: Active Messaging and Collaboration Data Objects (CDO)


Additional query words:
Keywords : ActMsg
Version : WINDOWS:1.1,4.0,5.0
Platform : WINDOWS
Issue type : kbhowto


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: November 21, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.