打印Outlook项时隐藏NeedlesCustomProperty报错:找不到指定DispID属性
解决Outlook自定义属性打印隐藏时的DispID找不到问题
看起来你在操作自定义属性的打印可见性时踩了DispID硬编码的坑——这个错误很明显是因为你的NeedlesCustomProperty类型并没有暴露[DispID=107]对应的属性/方法,直接用DispID调用InvokeMember肯定会失败。
先给你几个关键的修正点:
- 不要硬编码DispID:DispID是COM对象的内部标识符,不同版本或封装类型可能会变动,你应该直接用属性的公开名称来调用,而不是依赖DispID。对于Outlook的自定义属性(UserProperty),控制打印可见性的是
Flags属性,对应的PDO_PRINT_SAVEAS(0x4)常量就是用来控制是否在打印/保存时显示的标志位。 - 确认操作的是原生Outlook对象:如果
GetNeedlesUserPropertyValue返回的是封装后的自定义属性对象,你需要先获取到原生的OutlookUserProperty实例,再操作它的Flags属性。如果它本身就是原生对象,直接访问Flags即可,完全不需要用反射。 - 记得保存修改:修改属性标志后一定要调用
item.Save(),否则你的修改不会持久化,下次打开Outlook还是会显示这个属性。
给你调整后的代码示例:
直接操作原生UserProperty的情况
var item = outlookApplication.GetItemFromID(entryid); // 直接通过Outlook对象模型获取自定义属性 var outlookUserProp = item.UserProperties["NeedlesCustomProperty"]; if (outlookUserProp != null) { const long PDO_PRINT_SAVEAS = 0x4; // 移除打印可见的标志位 outlookUserProp.Flags &= ~PDO_PRINT_SAVEAS; // 保存修改 item.Save(); }
针对封装类的情况(如果GetNeedlesUserPropertyValue返回的是自定义封装对象)
var item = outlookApplication.GetItemFromID(entryid); var property = item.GetNeedlesUserPropertyValue(false); // 假设封装类提供了访问原生UserProperty的入口,比如UnderlyingUserProperty属性 var outlookUserProp = property.UnderlyingUserProperty; if (outlookUserProp != null) { const long PDO_PRINT_SAVEAS = 0x4; outlookUserProp.Flags &= ~PDO_PRINT_SAVEAS; item.Save(); }
你之前的问题核心是错误地依赖DispID来访问属性,而没有使用类型暴露的公开属性名,同时可能没有正确定位到原生的Outlook UserProperty对象进行操作。
内容的提问来源于stack exchange,提问作者Rick Harris
相关产品推荐
相关产品推荐

