更新:XE2 Update 2修复了下面描述的bug。
下面这个程序是从真实程序中剪裁出来的,它在XE2中会出现异常。这是自2010年以来的退化。我没有XE进行测试,但我期望该程序在XE上运行良好(感谢Primož确认代码在XE上可以正常运行)。
program COMbug;
{$APPTYPE CONSOLE}
uses
SysUtils, Variants, Windows, Excel2000;
var
Excel: TExcelApplication;
Book: ExcelWorkbook;
Sheet: ExcelWorksheet;
UsedRange: ExcelRange;
Row, Col: Integer;
v: Variant;
begin
Excel := TExcelApplication.Create(nil);
try
Excel.Visible[LOCALE_USER_DEFAULT] := True;
Book := Excel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT) as ExcelWorkbook;
Sheet := Book.Worksheets.Add(EmptyParam, EmptyParam, 1, EmptyParam, LOCALE_USER_DEFAULT) as ExcelWorksheet;
Sheet.Cells.Item[1,1].Value := 1.0;
Sheet.Cells.Item[2,2].Value := 1.0;
UsedRange := Sheet.UsedRange[LOCALE_USER_DEFAULT] as ExcelRange;
for Row := 1 to UsedRange.Rows.Count do begin
for Col := 1 to UsedRange.Columns.Count do begin
v := UsedRange.Item[Row, Col].Value;
end;
end;
finally
Excel.Free;
end;
end.
在 XE2 32 位版本中,错误是:
Project COMbug.exe raised exception class $C000001D with message 'system exception (code 0xc000001d) at 0x00dd6f3e'.
该错误发生在第二次执行 UsedRange.Columns
时。
在 XE2 64 位版本中,错误是:
Project COMbug.exe raised exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'
同样,我认为错误发生在第二次执行 UsedRange.Columns
时,但是 64 位调试器的代码步进方式稍微有些奇怪,所以我不能百分之百确定。
我已经针对该问题提交了一个QC报告。
对我来说,很明显 Delphi 的 COM/automation/interface 栈中出现了严重问题。这对于我使用 XE2 是一个完全的停机现象。
有人遇到过这个问题吗?有人有任何提示和建议可以尝试解决这个问题吗?调试这里正在发生什么排除问题超出了我的专业领域。