禁止使用 Outlook 邮件项目打印用户属性



我需要禁止以编程方式添加到邮件项目的 Outlook 用户属性的打印。我看到了以下问题,该问题在这里 dot.net 有一个解决方案,抑制 Outlook 现场打印,但我在将代码翻译成 delphi 时遇到问题。我的主要问题是 invokemember 行,我猜我需要在 delphi 中以某种方式使用 userproperty.invoke,但我对如何使用 invoke 方法所需的参数一无所知。有人可以帮我把这个问题的解决方案翻译成德尔福代码吗?

感谢 addin-express 人员的帮助,我有一个可行的解决方案......这似乎适用于Outlook 2016,仍然必须测试其他Outlook版本。问题是我不知道调用函数使用什么参数。

我在这里发布我的函数

function TAddInModule.RemoveUserPropertyPrintFlag( 
  var aUserProperty: UserProperty): Boolean; 
const 
  propID: integer = 107; 
  removePrinterFlag: integer = $4; 
var 
  res: OleVariant; 
  disp : TDispParams; 
  flags: Integer; 
  dispIDs: array[0..0] of TDispID; 
  args: array [0..0] of TVariantArg; 
begin 
   Result := False; 
   disp.cNamedArgs:= 0; 
   disp.cArgs:= 0; 
   if aUserProperty.Invoke(propID, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, disp, @res, nil, nil) = S_OK then 
   begin 
     if TVarData(res).VType = varInteger then 
     begin 
       flags := TVarData(res).VInteger; 
       args[0].vt := VT_INT; 
       args[0].intVal := flags and (not removePrinterFlag); 
       disp.cArgs := 1; 
       disp.cNamedArgs := 1; 
       dispIDs[0]:= DISPID_PROPERTYPUT; 
       disp.rgdispidNamedArgs := @dispIDs; 
       disp.rgvarg := @args; 
       Result:= aUserProperty.Invoke(propID, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, disp, nil, nil, nil) = S_OK; 
     end; 
   end; 
end; 

从另一个堆栈溢出的答案翻译成 delphi 的代码应该是这样的(未经测试):

function TAddInModule.SuppressUserPropertyPrinting(mailItem: _MailItem) : HResult;  
const  
  propID: integer = 107;  
  removePrinterFlag: integer = $4;  
var  
  props: UserProperties;  
  prop: UserProperty;  
  i: integer;  
  res: OleVariant;  
  disp : TDispParams;  
  flags: Integer;  
  dispIDs: array[0..0] of TDispID;  
  args: array [0..0] of TVariantArg;  
begin  
  props := mailItem.UserProperties;  
  if props.Count > 0 then begin  
    for i := 1 to props.Count do begin  
       prop := props.Item(i);  
       disp.cNamedArgs:= 0;  
       disp.cArgs:= 0;  
       Result:= prop.Invoke(propID, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, disp, @res, nil, nil);  
       if TVarData(res).VType = varInteger then begin  
         flags := TVarData(res).VInteger;  
         args[0].vt := VT_INT;  
         args[0].intVal := flags and (not removePrinterFlag);  
         disp.cArgs := 1;  
         disp.cNamedArgs := 1;  
         dispIDs[0]:= DISPID_PROPERTYPUT;  
         disp.rgdispidNamedArgs := @dispIDs; 
         disp.rgvarg := @args; 
         Result:= prop.Invoke(propID, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, disp, nil, nil, nil);  
       end;  
       prop := nil;  
    end;  
  end;  
  props := nil;  
end; 
您需要

在德尔福中使用IDispatch.Invoke()。Disp id 为 107,该值必须是类型 varInteger 且值为 4 的变体。VCL 源代码中有很多调用IDispatch.Invoke的示例。

如果使用 Redemption(我是它的作者)是一个选项,它会显式公开 RDOUserProperty.Printable 属性。

最新更新