【问题标题】:What is a "Variant of type (Error)"?什么是“类型变体(错误)”?
【发布时间】:2013-06-20 09:29:29
【问题描述】:

我有这段工作代码访问 Outlook AppointmentItem.PropertyAccessor.GetProperties 方法:

var
  lPropertyAccessor: OLEVariant;
  lDT              : TDateTime;
  lSchemas, lValues: Variant;

lPropertyAccessor := AAppointmentItem.PropertyAccessor;
lSchemas := VarArrayOf([cPublicStringNameSpace + PROPERTY_TIMETELLID + 'fail',
                        cPublicStringNameSpace + PROPERTY_TIMETELLSYNCTIME,
                        cPublicStringNameSpace + PROPERTY_TIMETELLSYNCID]);
try
  lValues := lPropertyAccessor.GetProperties(lSchemas);
  lEvent.CustSyncTTID := lValues[0];
  lDT := lValues[1];
  lDT := TTimeZone.Local.ToLocalTime(lDT);
  lEvent.CustSyncDate := lDT;
  lEvent.CustSyncEntryID := lValues[2];
except
end;

我导致第一个数组条目(“+'fail'”)失败,因为我想测试文档所说的内容:
If an error occurs for getting a specific property, the Err value will be returned in the corresponding location in the returned array.

调用GetProperties后,根据inspector窗口,lValues[0]包含:Error(-2147221233)。

我试图找到一个具有此值的 Windows 命名常量,以便我可以对其进行测试(如果 lValues[0] MagicalWindowsConst 然后...),但我找不到它或其十六进制等效 FFFFFFFF8004010F(甚至在 Embarcadero 源文件中也没有)。

如果我让代码继续,lEvent.CustSyncTTID 的整数赋值给出:
'无法将类型(错误)的变体转换为类型(整数)'

这表明存在一些“错误”变体类型???我也找不到。

我尝试定义 const cErr = -2147221233const cErr : Int64 = -2147221233 但这给了我在 if lValues[0] <> cErr 上的 Invalid Variant Operation 错误。

我可以测试什么来确定数组元素是否返回错误代码?

【问题讨论】:

  • 如果我们分解HRESULT,我们会看到前导8表示失败,SEVERITY_ERROR,设施是4FACILITY_ITF,代码是0x010FFACILITY_ITF 表示“错误的实际含义由接口定义。也就是说,从两个不同接口返回的具有完全相同的 32 位值的两个 HRESULT 可能具有不同的含义。”您正在使用 Outlook,Outlook 的错误是“无法访问 Outlook 数据文件”。

标签: delphi ole


【解决方案1】:

我找到了:

我可以测试if VarType(lValues[0]) <> varError

所以我显然忽略了is a varError type

【讨论】:

  • FWIW,还有VarIsError
  • 感谢您粘贴解决方案。它也帮助了我!
猜你喜欢
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 2018-11-26
相关资源
最近更新 更多