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