Как установить свойство как PT_BINARY (а не PT_MV_LONG) при использовании Redemption?

Обновить:

Эта проблема была исправлена ​​в Погашении 5.2:

Ранее именованные свойства MAPI в пространстве имен "string", заданном в формате DASL... всегда предполагалось иметь строковый тип (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);

Приведенный выше код не компилируется, но типы являются правильными.


Обновить:

Используя свойство string, как указано выше, Redemption создает свойство "MyProp/0x00000102", а не "MyProp".

2 ответа

Решение

Первый фрагмент выглядит прекрасно для меня. У меня не было проблем со следующим сценарием, выполняемым из OutlookSpy (нажмите кнопку "Редактор сценариев" на панели инструментов OutlookSpy, вставьте сценарий, нажмите "Выполнить"). Возможно, вам придется отменить выбор сообщения и выбрать его снова, чтобы увидеть недавно добавленное свойство. Второй фрагмент не устанавливает тип свойства (PT_BINARY).

dasl = "http://schemas.microsoft.com/mapi/string/ average312FD430-D997-418A-8E1F-8D224FE69F5D‹/MyProp/0x00000102"
затемнение данных (2)
данные (0) = 0
данные (1) = 1
данные (2) = 2
set Session = CreateObject ("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set msg = Session.GetMessageFromID (Application.ActiveExplorer.Selection (1).EntryID)
Msg.Fields (dasl) = данные
Msg.Save

Обновить:

Эта проблема была исправлена ​​в Погашении 5.2:

Ранее именованные свойства MAPI в пространстве имен "string", заданном в формате DASL... всегда предполагалось иметь строковый тип (PT_UNICODE или PT_STRING8).

Теперь можно явно указать тип свойства, например PT_LONG (=3): http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/MyIntegerUserProperty/0x00000003


Ну, не чувствую ли я себя глупым, задавая свой вопрос, а затем отвечая на него... в любом случае, вот что, похоже, происходит:

Погашение (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);
Другие вопросы по тегам