Mise à jour : La mise à jour 2 de XE2 corrige le bogue décrit ci-dessous.
Le programme ci-dessous, découpé à partir du programme réel, échoue avec une exception dans XE2. Il s'agit d'une régression depuis 2010. Je n'ai pas XE pour tester mais je m'attends à ce que le programme fonctionne bien sous XE (merci à Primož pour avoir confirmé que le code fonctionne bien sous 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.
Dans XE2 32 bit l'erreur est :
Le projet COMbug.exe a soulevé une exception de classe $C000001D avec le message 'exception système (code 0xc000001d) à 0x00dd6f3e'.
L'erreur se produit lors de la deuxième exécution de UsedRange.Columns
.
Dans XE2 64 bit l'erreur est :
Le projet COMbug.exe a soulevé une exception de classe $C0000005 avec le message 'c0000005 ACCESS_VIOLATION'.
Encore une fois, je pense que l'erreur se produit lors de la deuxième exécution de UsedRange.Columns
Mais le débogueur 64 bits parcourt le code d'une manière un peu bizarre, donc je n'en suis pas sûr à 100%.
J'ai soumis un Rapport CQ pour la question.
J'ai l'impression que quelque chose dans la pile COM/automatisation/interface de Delphi est complètement cassé. C'est un véritable coup d'arrêt pour mon adoption de XE2.
Quelqu'un a-t-il une expérience de ce problème ? Quelqu'un a-t-il des conseils à me donner sur la façon de contourner le problème ? Le débogage de ce qui se passe réellement ici ne relève pas de mon domaine d'expertise.