所以我正在尝试使用上述属性获取 SMTP 地址属性。但我得到算术溢出。
基本上我在使用:
IUnknown = Marshal.GetIUnknownForObject(recipientAddress.MAPIOBJECT);
HrGetOneProp(IMAPIProperty, PR_EMS_AB_PROXY_ADDRESSES, ref pPropValue);
SPropValue propValue = (SPropValue)Marshal.PtrToStructure(pPropValue, typeof(SPropValue));
IntPtr ptrToConvert = new IntPtr(propValue.Value); //arithmetic overflow
sProperty = Marshal.PtrToStringAnsi(ptrToConvert);
我创建的结构是:
private struct SPropValue {
public unit ulPropTag
public uint dwAlignPad
public long Value
}
我认为问题出在结构上:http: //msdn.microsoft.com/en-us/library/bb415341.aspx
问题是,propValue.Value 真的很“长”,不适合 IntPtr,我认为该结构实际上是 SPropValue 结构的指针,
所以我不太确定如何使用它以及如何解决这个问题。
任何帮助将不胜感激...
** 编辑 ** 我试图从 c++ 创建一个联合 PV 类,这是联合类:
typedef union _PV
{
short int i; /* case PT_I2 */
LONG l; /* case PT_LONG */
ULONG ul; /* alias for PT_LONG */
float flt; /* case PT_R4 */
double dbl; /* case PT_DOUBLE */
unsigned short int b; /* case PT_BOOLEAN */
CURRENCY cur; /* case PT_CURRENCY */
double at; /* case PT_APPTIME */
FILETIME ft; /* case PT_SYSTIME */
...
...
所以我创建了这个结构:
[StructLayout(LayoutKind.Explicit)]
private struct PV_Union
{
[FieldOffset(0)]
public Int16 i; /* case PT_I2 */
[FieldOffset(0)]
public Int32 l; /* case PT_LONG */
[FieldOffset(0)]
public UInt32 ul; /* alias for PT_LONG */
....
现在我得到垃圾值..