使用 outlook 邮件项目抑制用户属性打印
Suppress Userproperty printing with outlook mail items
我需要禁止打印以编程方式添加到邮件项目的 outlook 用户属性。我在 Suppressing Outlook Field Printing 看到了以下问题,它有 dot.net 的解决方案,但我在将代码转换为 delphi 时遇到问题。我的主要问题是 invokemember 行,我猜我需要在 delphi 中以某种方式使用 userproperty.invoke,但我对如何使用 invoke 方法所需的参数一无所知。有人可以帮我把那个问题的解决方案翻译成 delphi 代码吗?
您将需要在 Delphi 中使用 IDispatch.Invoke()
。 Disp id为107,取值必须是varInteger
类型的变体,取值为4。VCL源码中调用IDispatch.Invoke
的例子相当多
如果使用 Redemption (I am its author) is an option, it explicitly exposes the RDOUserProperty.可打印 属性.
感谢 addin-express 人员的帮助,我有一个可行的解决方案...似乎适用于 outlook 2016 仍然需要测试其他 outlook 版本。问题是我不知道调用函数要使用什么参数。
我在这里发布我的函数
function TAddInModule.RemoveUserPropertyPrintFlag(
var aUserProperty: UserProperty): Boolean;
const
propID: integer = 107;
removePrinterFlag: integer = ;
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;
从其他 Whosebug 的答案翻译到 delphi 的代码应该是这样的(未测试):
function TAddInModule.SuppressUserPropertyPrinting(mailItem: _MailItem) : HResult;
const
propID: integer = 107;
removePrinterFlag: integer = ;
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;
我需要禁止打印以编程方式添加到邮件项目的 outlook 用户属性。我在 Suppressing Outlook Field Printing 看到了以下问题,它有 dot.net 的解决方案,但我在将代码转换为 delphi 时遇到问题。我的主要问题是 invokemember 行,我猜我需要在 delphi 中以某种方式使用 userproperty.invoke,但我对如何使用 invoke 方法所需的参数一无所知。有人可以帮我把那个问题的解决方案翻译成 delphi 代码吗?
您将需要在 Delphi 中使用 IDispatch.Invoke()
。 Disp id为107,取值必须是varInteger
类型的变体,取值为4。VCL源码中调用IDispatch.Invoke
的例子相当多
如果使用 Redemption (I am its author) is an option, it explicitly exposes the RDOUserProperty.可打印 属性.
感谢 addin-express 人员的帮助,我有一个可行的解决方案...似乎适用于 outlook 2016 仍然需要测试其他 outlook 版本。问题是我不知道调用函数要使用什么参数。
我在这里发布我的函数
function TAddInModule.RemoveUserPropertyPrintFlag(
var aUserProperty: UserProperty): Boolean;
const
propID: integer = 107;
removePrinterFlag: integer = ;
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;
从其他 Whosebug 的答案翻译到 delphi 的代码应该是这样的(未测试):
function TAddInModule.SuppressUserPropertyPrinting(mailItem: _MailItem) : HResult;
const
propID: integer = 107;
removePrinterFlag: integer = ;
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;