私はそれを理解したと思います。私は VBA のみを使用したので、その制限を「考える」必要があります。VB.NET でも同じスキームに従います。
関数のシグネチャは次のとおりです。
Function GetNamesFromIDs(MAPIProp As Unknown, PropTag As Long) As NamedProperty
IUnknown
最初のパラメーターとして、インターフェイスをサポートするオブジェクトが必要です。_MAPIProp
Redemption のドキュメントを見ると、 という名前のインターフェースがあり、そこから他の多くの 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