使用Redemption时如何将属性设置为PT_BINARY(而不是PT_MV_LONG)?

时间:2011-11-19 00:19:05

标签: outlook-redemption

更新

此问题已在Redemption 5.2中修复:

  

以前,在DASL格式中指定的“string”命名空间中的命名MAPI属性...始终假定为字符串类型(PT_UNICODE或PT_STRING8)。

     

现在可以明确指定属性类型,例如PT_LONG(= 3):http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/MyIntegerUserProperty/0x00000003


我正在使用 Redemption 5.1 (和Outlook 2010/64),并遇到了这个非常烦人的情况:

尝试将byte[]的对象写入属性时,会将其写为PT_MV_LONG属性,而不是PT_BINARY

使用RDOProp.Fields

时会发生这种情况
RDOItem rdoItem = GetRDOItem();
// note this is typed PT_BINARY
string dasl = "http://schemas.microsoft.com/mapi/string/{312FD430-D997-418A-8E1F-8D224FE69F5D}/MyProp/0x00000102";
byte[] data = GetSomeData();
rdoItem.Fields[dasl] = data;

...或使用RDOUtils.HrSetOneProp时:

// this also sets MyProp, but does so as PT_MV_LONG, not PT_BINARY
RDOUtils utils = CreateUtils();
var mapiObject = rdoItem.MAPIOBJECT;
var propTag = utils.GetIDsFromNames(mapiObject,
    "{312FD430-D997-418A-8E1F-8D224FE69F5D}",
    "MyProp");
utils.HrSetOneProp(mapiObject, propTag, encoded);

上面的代码没有编译,但是类型是正确的。


更新

使用字符串属性的方式,Redemption正在创建属性“MyProp / 0x00000102”,而不是“MyProp”。

2 个答案:

答案 0 :(得分:1)

第一个片段对我来说非常好。我从OutlookSpy执行以下脚本没有问题(单击OutlookSpy工具栏上的“脚本编辑器”按钮,粘贴脚本,单击“运行”)。您可能必须取消选择该消息并再次选择它以查看新添加的属性。 第二个片段未设置属性类型(PT_BINARY)。

dasl =“http://schemas.microsoft.com/mapi/string/{312FD430-D997-418A-8E1F-8D224FE69F5D}/MyProp/0x00000102”
昏暗的数据(2)
data(0)= 0
data(1)= 1
data(2)= 2
设置Session = CreateObject(“Redemption.RDOSession”)
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set msg = Session.GetMessageFromID(Application.ActiveExplorer.Selection(1).EntryID)
Msg.Fields(dasl)=数据
Msg.Save

答案 1 :(得分:0)

<强>更新

此问题已在Redemption 5.2中修复:

  

以前,在DASL格式中指定的“string”命名空间中的命名MAPI属性...始终假定为字符串类型(PT_UNICODE或PT_STRING8)。

     

现在可以明确指定属性类型,例如PT_LONG(= 3):http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/MyIntegerUserProperty/0x00000003


好吧,我不会因为问我的问题然后回答它而感到愚蠢......无论如何,这里似乎正在发生的事情:

Redemption(5.1.0.0)似乎不理解表单中的属性,至少在RDOItem.Fields的上下文中是这样的:

http://schemas.microsoft.com/mapi/string/{312FD430-D997-418A-8E1F-8D224FE69F5D}/MyProp/0x00000102

它将属性命名空间后的所有内容作为属性名称,或者在这种情况下为MyProp/0x00000102,并且提示是它创建了一个具有有趣名称的属性。我仍然不确定是否可以使用Redemption指定名称(不是标记)类型(指针会很好......)

以下确实有效,尽管有点麻烦:

RDOUtils utils = CreateUtils();
var mapiObject = rdoItem.MAPIOBJECT;
var propTag = utils.GetIDsFromNames(mapiObject,
    "{312FD430-D997-418A-8E1F-8D224FE69F5D}",
    "MyProp");
propTag = ((propTag >> 16) << 16) | 0x0102; // add proptype
utils.HrSetOneProp(mapiObject, propTag, byteArray);