Как установить свойство как 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);