Outlook Redemption: GetNamesFromIDs - PullRequest
       73

Outlook Redemption: GetNamesFromIDs

1 голос
/ 30 октября 2008

Я пытаюсь получить все имена / значения свойств из элемента Outlook. У меня есть пользовательские свойства в дополнение к свойствам элемента внешнего вида по умолчанию. Я использую погашение, чтобы обойти предупреждения Outlook, но у меня возникают некоторые проблемы с методом GetNamesFromIDs для элемента Redemption.RDOMail ....

Я использую сеанс погашения, чтобы получить сообщение, и пытаюсь использовать сообщение, чтобы получить имена всех свойств.

Dim rMessage as Redemption.RDOMail = _RDOSession.GetMessageFromID(EntryID, getPublicStoreID())
Dim propertyList As Redemption.PropList = someMessage.GetPropList(Nothing)
For i As Integer = 1 To propertyList.Count + 1
    Console.WriteLine(propertyList(i).ToString())
    Console.WriteLine(someMessage.GetNamesFromIDs(________, propertyList(i)))
Next

Я не совсем уверен, что передать в качестве первого параметра getNamesFromIDs. Определение GetNamesFromIDs следующее:

GetNamesFromIDs(MAPIProp as Object, PropTag as Integer) As Redemption.NamedProperty

Я не совсем уверен, что должно быть передано как объект MAPIProp. Я не вижу это свойство в документации. http://www.dimastr.com/redemption/rdo/MAPIProp.htm#properties

Любая помощь или понимание будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 30 октября 2008

Думаю, я понял это. Я использовал только VBA, поэтому вам нужно «обдумать» его ограничения, он будет следовать той же схеме в VB.NET.

Сигнатура функции такова:

Function GetNamesFromIDs(MAPIProp As Unknown, PropTag As Long) As NamedProperty

В качестве первого параметра требуется объект, который поддерживает интерфейс IUnknown. Изучив документы Redemption, стало ясно, что существует интерфейс с именем _MAPIProp, из которого получены многие другие объекты RDO (среди них IRDOMail). Так что это, должно быть, тот самый RDOMail, из которого вы пытаетесь получить данные.

Зная это, ему понадобился только один тонкий намек из документов, чтобы он заработал:

Учитывая тег prop (> = 0x80000000), возвращает GUID и идентификатор названного свойство.

Таким образом, тег свойства должен быть >= 0x80000000, это означает, что он не будет работать для всех свойств, но только для пользовательских (я полагаю, в этом и заключается различие, поправьте меня, если я ошибаюсь.) теги, не удовлетворяющие этому условию, выдают сообщение об ошибке (0x8000ffff "неожиданные результаты").

Вот мой код. Это VBA, так что простите мне грубую ошибку Hex (), поскольку длинные целые числа VBA переполняются для таких больших чисел. Я уверен, что вы получите картину.

Sub GetNamesFromIds()

  Dim rSession As New Redemption.RDOSession
  Dim rMessage As Redemption.RDOMail
  Dim PropertyList As Redemption.PropList
  Dim PropTag As Long
  Dim EntryId As String
  Dim i As Integer

  rSession.MAPIOBJECT = Application.Session.MAPIOBJECT

  ' retrieve first random mail for this example '
  EntryId = ActiveExplorer.CurrentFolder.Items(1).EntryId
  Set rMessage = rSession.GetMessageFromID(EntryId)
  Set PropertyList = rMessage.GetPropList(0)

  For i = 1 To PropertyList.Count
    PropTag = PropertyList(i)
    If "0x" & Right("00000000" & Hex(PropTag), 8) > "0x80000000" Then
      Debug.Print
      If IsArray(rMessage.Fields(PropTag)) Then
        Debug.Print Hex(PropTag), "(Array:", UBound(rMessage.Fields(PropTag)), "items)"
      Else
        Debug.Print Hex(PropTag), "(", rMessage.Fields(PropTag), ")"
      End If
      Debug.Print "    GUID:", rMessage.GetNamesFromIds(rMessage, PropTag).GUID
      Debug.Print "      ID:", rMessage.GetNamesFromIds(rMessage, PropTag).ID
    End If
  Next

End Sub

Первый фрагмент с выхода:

8041001E      (             urn:content-classes:message )
    GUID:     {00020386-0000-0000-C000-000000000046}
      ID:     content-class
2 голосов
/ 30 октября 2008

Что ж, для справочной информации автор предлагает , используя что-то вроде OutlookSpy , чтобы увидеть, как Outlook хранит свойства.

Глядя на этот обмен (обязательно прочитайте все последующие ответы), не намного больше (на самом деле, я думаю, что однажды Outlook MVP набирает GetNamesFromIDs, когда он имеет в виду GetIDsFromNames).

То, что вы можете попробовать, это использовать GetIDsFromNames, чтобы увидеть, что это возвращает, а затем использовать это, чтобы перейти к GetNamesFromIDs.

Я раньше использовал Искупление, но не в этом конкретном смысле, так что это все, что у меня есть для вас ...

...