Delphi.cz

Český portál Delphi

Zpětná nekompatibilita pri volání OLE v XE2

Petr Fejfar upozornil v konferenci na změnu ohledně volání OLE v XE2 (změna je v Update4).

Cituji:

Narazil jsem na docela hnusný problém, že mi funkčni aplikace, vyvinutá v D2010 a migrovaná do XE2 přestala po přeloženi současnou XE2+Upd4 verzi pracovat. Konkrétně se jednalo o EOleException pri nastavování Borders.LineStyle:

  AWS.Range[ATopLeft,ABottomRight].Borders[AEdge].LineStyle := ALineStyle;

Update: readme - docwiki.embarcadero.com/RADStudio/en/Release_Notes_for_XE2_Update_4

Vodítkem k řešení mi byl jediný relevantní článek, který jsem k tomuto tématu našel: forums.embarcadero.com/thread.jspa?threadID=63416 (na konci), kde se EMB přiznává, že začal předávat longword jako longword místo dřivější konverze na integer:

    For XE2 we changed that. If you pass a LongWord,
     we will load the VARIANT with VT_UI4 because, well, it's been years since
     Unsigned Integer support has been added to OLE Automation.

     But it seems that Excel does not like that. If you invoke the Insert method
     of Range with VT_I4/0xFFFFEFE7(-4121) it works. But if you invoke it with
     VT_UI4/0xFFFFEFE7(-4121), it fails.

Nicméně, řešení s nastavením proměnné System.Variants.DispatchUnsignedAsSigned na TRUE mi nepomohlo - do kódu, který se podle její hodnoty řídí, jsem vůbec nedotrasoval. Takže jsem sice v initialization sekci to nastaveni proměnné ponechal pro strejčka příhodu, ale u vlastního přiřazení jsem musel udělat explicitní typecast na integer.

Datum: 2012-08-08 22:41:00 Tagy: DelphiXE2

Praxe