如何将COM对象作为IntPtr传递给P / Invoke方法?

时间:2012-09-20 07:36:57

标签: c# .net pinvoke outlook-addin mapi

目前使用Add-in Express开发Outlook加载项,我必须恢复一些纯MAPI函数来读取MAPI属性。

将此P / Invoke包装器放到HrGetOneProp function

[DllImport(@"MAPI32.DLL")]
static extern int HrGetOneProp(IntPtr pmp, uint ulPropTag, out IntPtr ppProp);

我正在尝试将类型为IMAPIProp的Outlook附件对象作为该函数的第一个参数传递。

我目前失败的是如何将该对象“转换”为IntPtr,以便我可以将其作为第一个参数传递给函数。我曾尝试使用Marshal.StructureToPtr,但很明显这种情况因异常而失败,因为我传递结构,而只是对非托管COM对象的引用。

所以我的问题是:

如何通过传递COM对象成功调用HrGetOneProp方法?

2 个答案:

答案 0 :(得分:5)

答案 1 :(得分:2)

我相信Marshal.GetComInterfaceForObjectMarshal.GetIUnknownForObjectMarshal.GetIDispatchForObject中的任何一个都应该有效