【发布时间】:2011-10-25 07:40:59
【问题描述】:
更新: XE2 Update 2 修复了下述错误。
下面的程序,从实际程序中删减,在 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 位中,错误是:
项目 COMbug.exe 引发异常类 $C000001D,消息“系统异常(代码 0xc000001d)在 0x00dd6f3e”。
第二次执行UsedRange.Columns时出现错误。
在 XE2 64 位中,错误是:
项目 COMbug.exe 引发异常类 $C0000005,消息为“c0000005 ACCESS_VIOLATION”
同样,我认为错误发生在第二次执行 UsedRange.Columns 时,但 64 位调试器以一种有点奇怪的方式逐步执行代码,所以我不能 100% 确定这一点。
我已为此问题提交了QC report。
在我看来,Delphi COM/automation/interface 堆栈中的某些东西被彻底破坏了。这对我采用 XE2 来说是一个完整的展示。
有人遇到过这个问题吗?有没有人对我如何尝试解决这个问题有任何提示和建议?调试这里真正发生的事情超出了我的专业领域。
【问题讨论】:
-
它在哪一行抛出?
-
已确认 - 在 XE 中工作,在 XE2 中崩溃。
-
它在 DispCallByIDProc 内部崩溃。丑陋。
-
分配给 v := UsedRange.Item[Row, Col].Value;没有必要 - 没有它也会崩溃。
-
听起来和这里发生的一模一样:stackoverflow.com/questions/7874995
标签: delphi com delphi-xe2