1

Outlook アイテムからすべてのプロパティ名/値を取得しようとしています。デフォルトの Outlook アイテム プロパティに加えて、カスタム プロパティがあります。Outlook の警告を回避するために引き換えを使用していますが、Redemption.RDOMail アイテムの GetNamesFromIDs メソッドで問題が発生しています....

償還セッションを使用してメッセージを取得し、メッセージを使用してすべてのプロパティの名前を取得しようとしています。

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

どんな助けや洞察も大歓迎です。

4

2 に答える 2

2

背景情報として、作成者はOutlookSpyのようなものを使用して、Outlookがプロパティをどのように格納するかを確認することを提案しています。

この交換を見ると(すべてのフォローアップ応答を必ず読んでください)、それ以上はありません(実際、ある時点でOutlook MVPがGetNamesFromIDs意味するときにタイプすると思いますGetIDsFromNames)。

あなたが試みるかもしれないGetIDsFromNamesことは、それが何を返すかを見るために使用し、そしてそれを使ってに渡すことGetNamesFromIDsです。

私は以前に償還を使用しましたが、この特定の方法ではないので、それが私があなたのために持っているすべてです...

于 2008-10-30T15:50:24.803 に答える
2

私はそれを理解したと思います。私は VBA のみを使用したので、その制限を「考える」必要があります。VB.NET でも同じスキームに従います。

関数のシグネチャは次のとおりです。

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

IUnknown最初のパラメーターとして、インターフェイスをサポートするオブジェクトが必要です。_MAPIPropRedemption のドキュメントを見ると、 という名前のインターフェースがあり、そこから他の多くの RDO オブジェクトが派生していることが明らかになりました(IRDOMailはその中にあります)。したがって、これはまさにRDOMailあなたがデータを取得しようとしているものでなければなりません。

それを知っていれば、それを機能させるために必要なのは、ドキュメントからのもう 1 つの微妙なヒントだけです。

prop タグ (>= 0x80000000) を指定すると、名前付きプロパティの GUID と ID が返されます。

したがって、プロパティ タグは である必要があります>= 0x80000000。これは、すべてのプロパティに対して機能するわけではなく、カスタム プロパティに対してのみ機能することを意味します (この場合の違いだと思います。間違っている場合は訂正してください)。この条件を満たさないプロパティ タグを渡すと、エラー メッセージ (0x8000ffff "unexpected results")。

これが私のコードです。これは 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
于 2008-10-30T17:04:10.427 に答える