1

Update:

This issue was fixed in Redemption 5.2:

Previously, named MAPI properties in the "string" namespace specified in the DASL format ... always assumed to be of string type (PT_UNICODE or PT_STRING8).

It is now possible to explicitly specify the property type, e.g. PT_LONG (=3): http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/MyIntegerUserProperty/0x00000003


I am using Redemption 5.1 (and Outlook 2010/64) and have run into this very annoying case:

When trying to write an object of byte[] to a property it writes it as an PT_MV_LONG property, not as PT_BINARY.

This occurs when either using 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;

...or when using 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);

The above code does not compile, but the types are correct.


Update:

With the string property the way it is above, Redemption is creating the property "MyProp/0x00000102", and not "MyProp".

Community
  • 1
  • 1

2 Answers2

1

The first snippet looks perfectly fine to me. I had no problem with the following script executed from OutlookSpy (I am its author - click “Script Editor” button on the OutlookSpy toolbar, paste the script, click Run). You might have to deselect the message and select it again to see the newly added property. The second snippet does not set the property type (PT_BINARY).

dasl = "http://schemas.microsoft.com/mapi/string/{312FD430-D997-418A-8E1F-8D224FE69F5D}/MyProp/0x00000102"
dim data(2)
data(0) = 0
data(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) = data
Msg.Save
Dmitry Streblechenko
  • 62,942
  • 4
  • 53
  • 78
  • It seems like the issue is that it string `http://schemas.microsoft.com/mapi/string/{312FD430-D997-418A-8E1F-8D224FE69F5D}/MyProp/0x00000102` isn't in a format understood by Redemption (5.1.0.0), and I put a few details in my lame self-answer :( -- I suppose I should get 5.2 already. Thanks for creating Redemption, btw, it's a very nice product and much less fuss then dealing with the OOM. –  Nov 19 '11 at 00:44
  • 1
    Yep, the ability to understand the property type ("/0x00000102") for the named properties in the "string" namespace was added in version 5.2: http://www.dimastr.com/redemption/history.htm – Dmitry Streblechenko Nov 19 '11 at 18:49
0

Update:

This issue was fixed in Redemption 5.2:

Previously, named MAPI properties in the "string" namespace specified in the DASL format ... always assumed to be of string type (PT_UNICODE or PT_STRING8).

It is now possible to explicitly specify the property type, e.g. PT_LONG (=3): http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/MyIntegerUserProperty/0x00000003


Well, don't I feel dumb for asking my question and then answering it... anyway, here is what seems to be happening:

Redemption (5.1.0.0) does not seem to understand a property in the form, at least in context of RDOItem.Fields:

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

It takes everything after the property namespace as the property name, or MyProp/0x00000102 in this case, and the tip-off was that it was creating a property with a funny name. I'm still not sure if it's possible to specify the name (not tag) and type in this manner with Redemption (pointers would be nice...)

The following does work, albeit it is a bit cumbersome:

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);
Community
  • 1
  • 1