Autor Téma: FYI: zpetna nekompatibilita pri volani OLE  (Přečteno 3722 krát)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2525
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
FYI: zpetna nekompatibilita pri volani OLE
« kdy: 07-08-2012, 14:01:15 »
Narazil jsem na docela hnusny problem, ze mi funkcni aplikace, vyvinuta v D2010 a migrovana do XE2 prestala po prelozeni soucasnou XE2+Upd4 verzi pracovat. Konkretne se jednalo o EOleException pri nastavovani Borders.LineStyle:
Kód: Delphi [Vybrat]
  1.   AWS.Range[ATopLeft,ABottomRight].Borders[AEdge].LineStyle := ALineStyle;
  2.  
Voditkem k reseni mi byl jediny relevantni clanek, ktery jsem k tomuto tematu nasel: https://forums.embarcadero.com/thread.jspa?threadID=63416 (na konci), kde se EMB priznava, ze zacal predavat longword jako longword misto drivejsi konverze na integer:
Citace
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.
Nicmene, reseni s nastavenim promenne System.Variants.DispatchUnsignedAsSigned na TRUE mi nepomohlo - do kodu, ktery se podle jeji hodnoty ridi, jsem vubec nedotrasoval. Takze jsem sice v initialization sekci to nastaveni promenne ponechal pro strejcka prihodu, ale u vlastniho prirazeni jsem musel udelat explicitni typecast na integer.

Tak kdyby nekdo na neco podobneho narazil, tak at vi, kterym smerem se vydat. Blby je, ze to nechyti preklad, ale projevi se to az za behu (kdyby clovek na vsechno stihal napsat regresni testy  :'( )
« Poslední změna: 07-08-2012, 14:07:34 od pf1957 »

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4224
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:FYI: zpetna nekompatibilita pri volani OLE
« Odpověď #1 kdy: 07-08-2012, 15:47:02 »
OT: K tomu Updt4 bol vydaný aj fix - oprava. Tak to volajú.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2525
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:FYI: zpetna nekompatibilita pri volani OLE
« Odpověď #2 kdy: 08-08-2012, 11:49:02 »
Citace
For XE2 we changed that. If you pass a LongWord,
 ...

Vypada to, ze jeste v UPD1 ta zmena nebyla.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2525
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:FYI: zpetna nekompatibilita pri volani OLE
« Odpověď #3 kdy: 08-08-2012, 15:00:46 »
OT: K tomu Updt4 bol vydaný aj fix - oprava. Tak to volajú.

Diky za info, nainstaloval jsem. Celkem nechapu, proc to neudali jako Upd5, aby se to samo zjistilo a nainstalovalo a delaji z toho hotfix, ktery ma stejne 250 MB...

Jinak ten hotfix dany problem neresi, stejne jako neresi ten bug v $IF DECLARED v jinem mnou zalozenem tematu.


pf

Online Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2278
  • Karma: 101
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:FYI: zpetna nekompatibilita pri volani OLE
« Odpověď #4 kdy: 09-08-2012, 17:06:21 »
Jak jsem byl upozorněn, tak je k tomu nějaké readme - http://docwiki.embarcadero.com/RADStudio/en/Release_Notes_for_XE2_Update_4#Automation_Servers_and_Unsigned_Integers

NOTE: The above only affects Variant- and DispInterface-based automation. That is, automation calls via vtable/interface are unaffected by the failure and workaround described here.

« Poslední změna: 09-08-2012, 17:08:11 od Radek Červinka »
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2525
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:FYI: zpetna nekompatibilita pri volani OLE
« Odpověď #5 kdy: 09-08-2012, 17:45:18 »
NOTE: The above only affects Variant- and DispInterface-based automation. That is, automation calls via vtable/interface are unaffected by the failure and workaround described here.

No z te poznamky jsem Gogo: kdyz trasuju svuj problem do ComObj, tak to vola DispatchInvoke, ktera bere jako argument IDispatch (a na nem vola Invoke), ale jeste predtim si pripravi argumenty v GetDispatchInvokeArgs. I na zaklade mych chatrnych znalosti bych usuzoval, ze se jedna o pripad DispInterface.based automation...

Nicmene, navrhovany workaround problem neresi, nejspis proto, ze tu konverzi na zaklade hodnoty promenne DispatchUnsignedAsSigned delaji v te metode GetDispatchInvokeArgs na argumentech predanych hodnotou a na argumenty, predavane odkazem (atByRef) se vybodli.
« Poslední změna: 09-08-2012, 18:50:30 od pf1957 »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2525
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:FYI: zpetna nekompatibilita pri volani OLE
« Odpověď #6 kdy: 10-08-2012, 08:35:06 »
Nicmene, navrhovany workaround problem neresi, nejspis proto, ze tu konverzi na zaklade hodnoty promenne DispatchUnsignedAsSigned delaji v te metode GetDispatchInvokeArgs na argumentech predanych hodnotou a na argumenty, predavane odkazem (atByRef) se vybodli.

Je to tak: kdyz uz jsem s tim ztratil tolik casu, tak jsem to protrasoval poradne a ta hodnota LineStyle se predava odkazem, tj. typ argumentu je $93 = atByRef or varLongWord, takze ten jejich workaround ve funkci GetDispatchInvokeArgs je jen polovicatej a vsechno, co udelali ve vetvi else u hodnotou predavanych argumentu by meli udelat take ve vetvi predavane odkazem:
Kód: Delphi [Vybrat]
  1. if (ArgType and atTypeMask) = atByRef then
  2. begin
  3.   ...
  4.   // Tady jim ta konverze unsigned -> signed chybi
  5.   ...
  6. end
  7. else // ByVal
  8. begin
  9.   ...
  10.   // Tady konverze pridali
  11.   ...
  12.