ActiveX nelle hosted application

Se sviluppate hosted application per MCE è molto probabile che abbiate la necessità di usare un linguaggio più potente. Per esempio nella mia demo di MyHome ho avuto la necessità di dialogare sulle porte della parallela.
Per far questo dobbiamo ricorrere agli ActiveX. Non dobbiamo preoccuparci di compatibilità perché MCE lavora solo con Internet Explorer e gira come Administrator (purtroppo) e quindi non abbiamo limiti nell'installazione.
Ovviamente l'ActiveX l'ho sviluppato in .NET. Prima di tutto creaiamo un assembly con una o più classi e quelle che devono essere usate come oggetti com marchiamole con questi attributi

 [ClassInterface(ClassInterfaceType.None)]
 [Guid("....")]
public class MiaClasse

Il guid è preferibile metterlo da subito (createlo con il tool di VS.Net) così sapremo dove cercare le chiavi di registro. Inoltre, se prevedete proprietà o metodi da utilizzare tramite JavaScript create un'interfaccia con i membri che vi interessano e implementatela nella vostra classe, es:

 [Guid("...")]
 public interface IMiaClasse
 {
void MioMetodo(int par);
 }

Il Guid dev'essere diverso. Le altre classi se non prevedete di usarle, marcatele con ComVisible a false.
Una volta compilato registrate l'assembly come oggetto com con il tool regasm.exe. Ora troverete nel registro con chiave HKEY_CLASSES_ROOT\CLSID\{guid} la vostra classe registrata.
Non ci resta che usarla in una pagina html.
Per creare l'oggetto in JavaScript si usa la classe ActiveXObject:

var classe = new ActiveXObject("namespace.MiaClasse");
classe.miometodo(0);

Ecco fatto. E' abbastanza semplice. Un'ultima cosa: i criteri di sicurezza del SP2 vi chiederanno la conferma per l'attivazione dell'ActiveX. Per evitare ciò, aggiungete la chiave
HKEY_CLASSES_ROOT\CLSID\{guid}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}
Sarà sufficiente per evitare il messaggio sgradevole in MCE.

Nella stessa categoria

Commenti
federico.caselli scrive:
ActiveX nelle hosted application

Ciao,
ho provato in diversi modi a esporre un evento di una classe COM library scritta in vb.net ed intercettarlo da JScript in una hosted HTML application. La classe non ha interfaccia grafica ho semplicemente utilizzato aggiungi nuovo elemento da VS.NET --> Classe COM ed ho scritto il codice identico a qualsiasi altra classe .NET. L'errore all'interno della pagina è "Proprietà o metodo non supportati".

Mi puoi dare un suggerimento?

Grazie.
21/07/2005 ore 10.49 | 13 risposte
federico.caselli scrive:
Re: ActiveX nelle hosted application

Dimenticavo, i metodi e le proprietà funzionano correttamente, il problema è solo sugli eventi.
21/07/2005 ore 10.50 | 1 risposta
Ricciolo scrive:
Re: ActiveX nelle hosted application

Mmm, come intercetti l'evento da js e come si chiama l'evento?
21/07/2005 ore 14.18 | 1 risposta
federico.caselli scrive:
Re: ActiveX nelle hosted application

da Jscript:

objDownload.DownloadComlete = onDownloadCompleted

function onDownloadCompleted(){
var MCE = window.external.MediaCenter();
var ret = MCE.Dialog("Download completed", "Download information", 1, 5, false)
}


nella classe vb:

Public Delegate Sub DownloadComleteEventHandler(ByVal Sender As Object, ByVal e As System.EventArgs)

Public Event DownloadComplete As DownloadComleteEventHandler
21/07/2005 ore 15.18 | 1 risposta
Ricciolo scrive:
Re: ActiveX nelle hosted application

mm, prova la forma

<SCRIPT FOR=idoggetto EVENT=DownloadComlete LANGUAGE="JScript">


A dir la verità l'evento non l'ho mai provato, devo provare stasera, comunque un evento è composto da due metodi Add_nomeevento Remove_nomeevento, quindi volendo puoi creare il metodo per concatenare il delegate, es

private downloadComplete as DownloadComleteEventHandler

Public sub AddDownloadComplete(handler as DownloadComleteEventHandler
downloadComplete = Delegate.Combine(downloadComplete, handler)
end sub

E' un trucchetto che dovrebbe andar bene
21/07/2005 ore 15.26 | 1 risposta
federico.caselli scrive:
Re: ActiveX nelle hosted application

Per poter usare SCRIPT FOR..., devo anche istanziare la classe ActiveX nella forma dichiarativa anziché

var objDownload = new ActiveXObject("MyDownload10.MyDownload10X")

come è adesso?

per quanto riguarda il codice vb che mi hai suggerito, non ho capito come si integra con quello che ho scritto.
Devo eliminare la dichiarazione pubblica dell'evento, sostituendola con

private downloadComplete as DownloadComleteEventHandler

?

il codice

Public sub AddDownloadComplete(handler as DownloadComleteEventHandler
downloadComplete = Delegate.Combine(downloadComplete, handler)
end sub

va aggiunto all'interno della classe?
21/07/2005 ore 16.36 | 1 risposta
Ricciolo scrive:
Re: ActiveX nelle hosted application

Ah no, non avevo pensato che lo istanziavi da codice. Sì devi togliere l'evento e mettere quel metodo con quel delegate.
In pratica facciamo noi a mano quello che fa il compilatore ma che maschera
21/07/2005 ore 16.49 | 1 risposta
federico.caselli scrive:
Re: ActiveX nelle hosted application

Come si genera l'evento nella funzione Download() all'interno della classe?

Ho provato con

downloadComplete.Invoke(Me, New System.EventArgs())

ma ottengo l'eccezione
"Riferimento a un oggetto non impostato su un'istanza di un oggetto"

(l'ho sparata grossa?)
22/07/2005 ore 11.19 | 1 risposta
Ricciolo scrive:
Re: ActiveX nelle hosted application

No è giusto, oppure
downloadComplete(Me, ..)
ma vuol dire che è nullo e nessuno non si è agganciato. Controlla sempre non sia nothing
22/07/2005 ore 11.28 | 1 risposta
federico.caselli scrive:
Re: ActiveX nelle hosted application

Significa che prima del metodo
downloadComplete.Invoke(Me, New System.EventArgs())
dovrei chiamare il metodo AddDownloadComplete? Scusami, ma non ho capito cosa dovrei passare come argomenti...
22/07/2005 ore 12.08 | 1 risposta
Ricciolo scrive:
Re: ActiveX nelle hosted application

Sì, da javascript, passando la funzione che vuoi richiamare per l'evento
22/07/2005 ore 12.30 | 1 risposta
federico.caselli scrive:
Re: ActiveX nelle hosted application

Ma allora non devo più utilizzare la forma

<SCRIPT FOR=objDownload EVENT=DownloadComlete LANGUAGE="JScript">
var MCE = window.external.MediaCenter();
var ret = MCE.Dialog("You did it, boy", "Download information", 1, 5, false)
</SCRIPT>

giusto?

Ci ho provato, ma ottengo l'eccezione da JScript:
'La classe non supporta l'automazione':

function fnDownloadNew(){
...
objDownload.AddDownloadComplete(onDownloadCompleted)
...
}

function onDownloadCompleted(){
var MCE = window.external.MediaCenter();
var ret = MCE.Dialog("You did it, boy", "Download information", 1, 5, false)
}
22/07/2005 ore 12.48 | 1 risposta
Ricciolo scrive:
Re: ActiveX nelle hosted application

Sì giusto, ma cavoli... prvo anch'io a vedere se riesco a farlo. Ti faccio sapere.
Come ti ho detto non ho mai usato gli eventi
22/07/2005 ore 13.02 | 1 risposta
federico.caselli scrive:
ActiveX nelle hosted application

Sai se c'è un modo più automatico per evitare il messaggio di protezione? C'entra qualcosa l'interfaccia IObjectSafety?
19/07/2005 ore 16.42 | 3 risposte
Ricciolo scrive:
Re: ActiveX nelle hosted application

Più automatico che aggiungere la chiave nel registro...
Se il tuo motivo è che non ti piace fare il setup che scrive la chiave di registro allora sappi che lo dovrai fare comunque poiché va registrato (al di là della protezione) come oggetto com (che anch'esso scrive chiavi nel registro)
Se vuoi automatizzare di più le cose puoi inserire nella tua classe com due metodi da marcare con gli attributi System.Runtime.InteropServices.ComRegisterFunctionAttribute e System.Runtime.InteropServices.ComUnregisterFunctionAttribute.
I due metodi vengono chiamati rispettivamente quando registri o unregistri un assembly come com (o con regasm o come libreria). Per scrivere quella chiave tra le implemented categories puoi sfruttare la classe Microsoft.Win32.Registry e affini per scrivere nel registro.
Nel setup se vuoi registrare un oggetto come com o inserisci le chiavi di registro a mano, cosa sconsigliata, oppure usa la classe System.Runtime.InteropServices.RegistrationServices.RegisterAssembly che fa la stessa cosa di regasm
19/07/2005 ore 16.55 | 1 risposta
federico.caselli scrive:
Re: ActiveX nelle hosted application

Ma se creo un progetto di setup con VS.NET e includo i files .tlb (generati precedentemente sempre da VS.NET) e imposto a design time (che bella parola) la proprietà Register del file tlb sul valore "vsdrfCOM", il setup risultante non si occuperà da solo della registrazione COM sul PC client?

Mentre, per il problema della protezione, posso creare un programma console con VS.NET che aggiunge la chiave di registro ed eseguire tale programma come azione personalizzata del progetto di setup?
19/07/2005 ore 17.21 | 1 risposta
Ricciolo scrive:
Re: ActiveX nelle hosted application

Sì va bene uguale. Comunque da setup puoi anche creare le chiavi di registro, c'è una sezione apposita. Ti basta creare lo stesso ramo di chiavi e aggiungere tra le implemented categories quella chiave.
T'ho solo dato varie possibilità
19/07/2005 ore 17.23
federico.caselli scrive:
ActiveX nelle hosted application

Avrei un'altro piccolo problema...

Ho realizzato la COM library con VB 2005. Con internet explorer funziona (funzionava anche prima di aggiungere la chiave {7DD95801-9882-11CF-9FA9-00AA006C42C4}, anche se con il fastidioso messaggio...

Quando apro la stessa pagina su Media Center, invece, l'oggetto ActiveX non viene nemmeno istanziato, sia prima che dopo l'aggiunta della chiave. E non appariva nessun messaggio di sicurezza nemmeno prima dell'aggiunta della chiave.

Avresti qualche suggerimento?

Grazie.
01/07/2005 ore 12.51 | 4 risposte
Ricciolo scrive:
01/07/2005 ore 13.09 | 1 risposta
federico.caselli scrive:
Re: ActiveX nelle hosted application

Si, ho utilizzato la stessa macchina per lo sviluppo in VS 2005, per il test con internet explorer, e per il test con Media Center. La cosa singolare è che con internet explorer funziona e con Media Center no...
01/07/2005 ore 14.31 | 1 risposta
Ricciolo scrive:
Re: ActiveX nelle hosted application

mm, credo che l'assembly giri con la stessa versione con cui gira mce, quindi la 1.0.
Perché usi .net 2? cosa devi usare che la 1.x non ha?
01/07/2005 ore 14.45 | 1 risposta
federico.caselli scrive:
Re: ActiveX nelle hosted application

Niente. Credo che sia la mia vocazione astrale per le cose complicate. Grazie per il suggerimento, adesso provo con la versione 1.0. Ma il VS 2002 ha le stesse facilitazioni per creare COM libraries che ha il VS 2005?


P.S. per dirla tutta il mio ActiveX di .Net non avrebbe proprio bisogno, visto che ha solo una chiamata API per il controllo della ripetizione della tastiera 8)
01/07/2005 ore 15.34
federico.caselli scrive:
ActiveX nelle hosted application

Ciao, avrei qualche curiosità da chiedere, da programmatore non troppo esperto che ha bisogno di sviluppare per MCE:

-se la classe ActiveX espone degli eventi, come si intercettano da VBScript?

-per scrivere un'applicazione hosted HTML è necessario usare Notepad (o Textpad ecc...) o esiste qualche facilitazione? Ho provato con VS.Net 2003, ma non sono riuscito a farci niente.

Grazie mille.
10/05/2005 ore 14.59 | 2 risposte
Ricciolo scrive:
Re: ActiveX nelle hosted application

federico.caselli ha scritto:
Ciao, avrei qualche curiosità da chiedere, da programmatore non troppo esperto che ha bisogno di sviluppare per MCE:

-se la classe ActiveX espone degli eventi, come si intercettano da VBScript?


Così come si intercettano gli eventi onload, onunload ecc del document


-per scrivere un'applicazione hosted HTML è necessario usare Notepad (o Textpad ecc...) o esiste qualche facilitazione? Ho provato con VS.Net 2003, ma non sono riuscito a farci niente.
.


Non sono altro che pagine html, quindi puoi usare quello che vuoi. Vs.net non ha niente in più se non della colorazione del codice o l'aiuto nel creare le pagine asp.net se vuoi offrire interattività.
Scarica l'sdk di mce contiene degli esempi
10/05/2005 ore 15.51
federico.caselli scrive:
Re: ActiveX nelle hosted application

Ehm... veramente ho provato anche con Front Page 2002, ma la pagina si presenta piena di errori... Ad esempio la pagina NavToPage.htm dell'sdk, o qualsiasi altro HTML sample dell'sdk.
26/05/2005 ore 15.03
TrackBack scrive:
09/02/2005 ore 23.41

Per inserire un commento, devi registrarti alla nostra community.

© 1998-2008 - Ricciolo.NET - Il blog di Cristian "Ricciolo" Civera

TagCloud
BLOG INFO
  • Post: 168
  • Commenti: 74
  • TrackBacks: 36
  • Feed blog e contenuti tecnici: RSS
  • Feed blog: RSS Atom OPML

MVP
CATEGORIE
I PIÙ LETTI DEL MESE
IN EVIDENZA