Не работает ли COM в XE2, и как я могу это исправить?

Обновление: Обновление 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.

Кто-нибудь сталкивался с этой проблемой? Есть ли у кого-нибудь советы и рекомендации, как я могу попытаться обойти проблему? Отладка того, что здесь действительно происходит, выходит за рамки моей компетенции.

53
задан David Heffernan 1 November 2011 в 23:55
поделиться