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

vložil Radek Červinka 8. srpna 2012 23:41

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.

Tagy:

Praxe

Komentáře

9.8.2012 8:15:35 #

Petr Kohut

Ona je otázka zda se initialization sekce vůbec vykoná. Delphi XE2 mají tendenci initialization sekce unitů v BPL nevykonávat.

Petr Kohut

9.8.2012 14:57:02 #

Zdeněk Vašků

To platí obecně v BPL. Pokud není unita použita v exe, tak se v bpl neinicializuje.

Jinak s tím OLE je to popsáno v readme.txt k updatu, ale taky jsem si přečetl až dodatečně.

Zdeněk Vašků

9.8.2012 18:05:09 #

Radekc

Zdenku mas recht: http://docwiki.embarcadero.com/RADStudio/en/Release_Notes_for_XE2_Update_4#Automation_Servers_and_Unsigned_Integers

Radekc

11.8.2012 18:59:37 #

pf1957

Ano, je to sice v readme, ale

1. aby se cloveku (alespon me) rozsvitilo, musel by si uvedomit, ze kdyz prirazuje literal napr. xlDashed a roky az do XE2+Upd1 to fungovalo, ze nektere literaly (enumy ze stejne domeny) maji zaporne hodnoty, v Delphi definovane jako $FFFFxxxx (longword) a ze to s tim souvisi...
2. ze workaround v tom readme nejde prelozit pred XE2+Upd2, protoze je bug v prekladaci u $IF DECLARED, o kterem jsem psal v jinem tematu
3. I kdyz zvitezi clovek nad kompilatorem a tu globalni promennou nejak priradi, tak mu to stejne u nekterych pripadu nepomuze, protoze workaround je polovicaty a resi jen argumenty predavane hodnotou a ne odkazem - o to jsem taky psal
4. Pokud si bude clovek vlastni wrapper kolem OLE chtit strcit do BPL, musi se vyporad i s INITIALIZATION

pf1957

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců