Как установить свойство как PT_BINARY (а не PT_MV_LONG) при использовании Redemption? - PullRequest
1 голос
/ 19 ноября 2011

Обновление:

Эта проблема была исправлена ​​в Погашение 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 (и 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 ]

1 голос
/ 19 ноября 2011

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

dasl = "http://schemas.microsoft.com/mapi/string/{312FD430-D997-418A-8E1F-8D224FE69F5D}/MyProp/0x00000102"
затемненные данные (2)
данные (0) = 0
данные (1) = 1
data (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

0 голосов
/ 19 ноября 2011

Обновление:

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

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