Обновление: Обновление XE2 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 бит ошибка:
Project COMbug.exe поднял класс исключений $C000001D с системным исключением (код 0xc000001d) с кодом 0x00dd6f3e.
Ошибка при втором выполнении UsedRange.Columns
.
В 64-битной версии XE2 ошибка:
Project COMbug.exe поднял класс исключений $C0000005 с сообщением 'c0000005 ACCESS_VIOLATION'
Опять же, я думаю, что ошибка возникает при втором выполнении UsedRange.Columns
, но 64-разрядный отладчик немного меняет код, поэтому я не уверен на 100%.
Я представил отчет QC для проблемы.
Мне очень нравится, как будто что-то в стеке Delphi COM/автоматизации/интерфейса полностью разбито. Это полная демонстрация для моего внедрения XE2.
Есть ли у кого-нибудь опыт этой проблемы? У кого-нибудь есть советы и советы относительно того, как я могу попытаться решить проблему? Отладка того, что действительно происходит здесь, находится за пределами моей компетенции.