ActiveX - Conclusione

Vedi post precedenti: ActiveX e ActiveX(2)

Finalmente "l'opera" è conclusa. Ma perchè questo sbattimento?

Lo scopo era quello di utilizzare controlli managed in ambiente non managed. Nello specifico infilare un pannello c# dentro un form MFC (visual studio 6).

Ufficialmente la registrazione di un componente windows form come ActiveX non è supportata. Le alternative ufficiali quindi non sono molte Smile triste. Microsoft supporta come contenitore di componenti .net windows forms (olltre alle windows forms stesse) MFC 7.x (quindi versione .net) e internet explorer 5.01 o superiore (vedi). La soluzione internet explorer proposta è decisamente insufficiente, infatti funziona unicamente lavorando con un web server (costruendo la pagina ed aprendola in locale i componenti non vengono visualizzati, la cosa funziona invece correttamente se la pagina risiede su iis).

Ufficialmente quindi l'unica alternativa valida è compilare l'applicazione di origine sotto .net come codice unmanaged (combattendo con errori e warning vari) ed all'interno di questa non come oggetti ActiveX registrati ma come oggetti managed ottenendo l'interfaccia COM IUnknown dal controllo windows forms, le alternative per fare questo sono due:

  1. Use the CLR hosting COM objects in native code to host the CLR, create the default AppDomain and create an instance of the UserControl in this AppDomain. (vedi documento Hosting Interfaces.doc nella directory Tool Developers Guide dell'SDK di .Net)
  2. Use Managed Extension to C++, directly create the UserControl with "new MyControl()", and use the Marshal::GetObjectForIUnknown() to get the IUnknown of the UserControl

Fonte: Active Document Server and .NET FONT migration

La prima ipotesi consente di lasciare unmanaged tutto il codice MFC del contenitore (riducendo però le possibilità di interazione, la seconda comporta la necessità di compilare parte dell'applicazione MFC come managed ottenendo però così l'accesso totale al controllo incluso.

Non contento delle possibilità ufficialmente supportate ho provato a percorrere la strada dell'ActiveX. A questo punto si sono aperte altre possibilità:

  1. ActiveX in MFC 6
  2. ActiveX in Internet Explorer con CLSID (da includere a sua volta in MFC 6)
  3. ActiveX in ATL (.NET) e ATL come ActiveX in MFC 6.

Ho testato le tre possibilità (non supportate da Microsoft). I test hanno portato a concludere che la 1 risulta molto instabile. La 2 è semplice da implementare e decisamente stabile (anche se molto limitato per quanto riguarda la comunicazione tra il contenitore e l'ActiveX), la 3 risulta incredibilmente stabile e completa ma decisamente complessa da implementare.

Traendo rapide conclusioni, la soluzione preferibile rimane ovviamente quella proposta da Microsoft, ma se il tempo stringe ed è necessaria una soluzione molto rapida l'utilizzo di Controlli Windows Forms dentro Internet Explorer come ActiveX non è da disdegnare (semprechè non sia necessario un alto livello di comunicazione). La 3 pur risultando stabile e completa richiede uno sforzo implementativo che forse è più utile dirottare sulla soluzione Microsoft.

powered by IMHO 1.1 with Emoticon Formatter

 

Print | posted on mercoledì 12 gennaio 2005 18:11

Copyright © Gabriele Gaggi

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski