我需要禁止以编程方式添加到邮件项目的 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 属性。