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.
Dimenticavo, i metodi e le proprietà funzionano correttamente, il problema è solo sugli eventi.
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
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
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?
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
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?)
No è giusto, oppure
downloadComplete(Me, ..)
ma vuol dire che è nullo e nessuno non si è agganciato. Controlla sempre non sia nothing
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...
Sì, da javascript, passando la funzione che vuoi richiamare per l'evento
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)
}
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
Sai se c'è un modo più automatico per evitare il messaggio di protezione? C'entra qualcosa l'interfaccia IObjectSafety?
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
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?
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à
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.
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...
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?
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)
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.
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
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.
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.





Stampa
Download



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.
Continua »»» | Rispondi »»»