使用Outlook邮件项禁止Userproperty打印

时间:2017-01-13 10:51:46

标签: delphi outlook vsto outlook-addin

我需要禁止以编程方式添加到邮件项目的outlook userproperties的打印。我在这里看到了以下有关dot.net解决方案的问题Suppressing Outlook Field Printing,但我在将代码转换为delphi时遇到了麻烦。我的主要问题是调用成员行我猜测我需要在delphi中以某种方式使用userproperty.invoke,但我对如何使用调用方法所需的参数毫无头绪。有人可以帮助我将解决方案从那个问题翻译成delphi代码吗?

2 个答案:

答案 0 :(得分:0)

您需要在Delphi中使用IDispatch.Invoke()。 Disp id为107,值必须是varInteger类型的变量,值为4.在VCL源代码中调用IDispatch.Invoke的例子很多。

如果使用Redemption是一个选项,它会明确地公开RDOUserProperty。可打印属性。

答案 1 :(得分:0)

感谢在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; 

从其他stackoverflow的答案转换为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;