Zum Inhalt wechseln

Willkommen auf der MCE-Community.de
Registriere dich jetzt um den Zugriff auf alle Funktionen zu erhalten. Einmal registriert und eingeloggt können dann Themen mit Bildern angeschaut werden, Fragen gestellt und beantwortet werden. Weitere Funktionen sind: Themen abonnieren, ein eigenes Postfach, ein eigenes Profil und vieles mehr. Die Nutzung der Community ist 100% kostenfrei. Es ist also KEIN Abo oder sonstige Gebühren für die Mitgliedschaft zu zahlen. Wenn du bereits angemeldet bist, Log dich ein - ansonsten erstelle ein Konto kostenfrei bei uns!

Aus HTML auf Klassen-Methoden zugreifen


  • Please log in to reply
10 Antworten in diesem Thema

#1
Leon

Leon

    MegaByte Ass

  • SpecialMember Pro
  • PIPPIPPIPPIP
  • 333 Beiträge
Ich programmiere immer noch eifrig an meinem ersten PlugIn. Dabei handelt es sich um eine Neuauflage des mceAC3Filter AddIn's, welches Peacemaker einmal für mich in VisualBasic programmiert hat. Da ich von VisualBasic jedoch nichts halte und mich stattdessen auf C++ und C# spezialisiert habe, ist das AddIn folglich in C# geschrieben.

Zunächst einmal der C# Quellcode des PlugIns:

using System;      // Für MarshalByRefObject
using Microsoft.Win32;    // Für den Zugriff auf die Registry
using System.Collections;  	// Liefert Anwendungsinformationen
using Microsoft.MediaCenter.AddIn;	// MediaCenter Steuerungsoptionen

namespace AC3FilterAddIn
{
	public class mceAC3Filter : MarshalByRefObject, IAddInModule, IAddInEntryPoint
	{
  private AddInHost mcHost;
  private MediaTransport mcMediaTransport;
  private RegistryKey rk = Registry.CurrentUser.OpenSubKey("Software\\AC3Filter\\preset\\Default");
  
  
  void IAddInModule.Initialize(IDictionary dictAppInfo, IDictionary dictEntryPoint)
  {	
  }
  
  
  void IAddInModule.Uninitialize()
  {
  }
  
  
  void IAddInEntryPoint.Launch(AddInHost host)
  {
  	this.mcHost = host;

  	// Test-Dialog um zu prüfen, ob AddIn geladen wurde.
  	mcHost.HostControl.Dialog("AddIn wurde geladen...","mceAC3Filter",1,10,false);
  }
  
  
  public double GetValue(String sValue)
  {
  	double dValue = (double)this.rk.GetValue(sValue);
  	
  	dValue = 20 * Math.Log10(dValue);
  	
  	return dValue;
  }
  
  
  public double GetStraightValue(String sValue)
  {
  	double dValue = (double)this.rk.GetValue(sValue);

  	return dValue;
  }
  
  
  public void SetValue(String sValue, double dValue)
  {
  	if(this.PlayingCheck() == false)
  	{
    dValue = Math.Pow(10, dValue / 20);
    
    this.rk.SetValue(sValue, dValue);
  	}
  }
  
  
  public void SetStraightValue(String sValue, double dValue)
  {
  	if(this.PlayingCheck() == false)
  	{
    this.rk.SetValue(sValue, dValue);
  	}
  }
  
  
  private bool PlayingCheck()
  {
  	bool check;
  	
  	int playing = this.mcMediaTransport.PlayState.CompareTo(PlayState.Playing);
  	int paused  = this.mcMediaTransport.PlayState.CompareTo(PlayState.Paused);
  	
  	if(playing == 1 || paused == 1)
  	{
    this.mcHost.HostControl.Dialog("Bitte beenden Sie zuerst die aktuelle Wiedergabe.","Speichern nicht möglich",1,10,false);
    check = true;
  	}
  	else
  	{
    check = false;
  	}
  	
  	return check;
  }


  public void ErrorMessage1001()
  {
  	this.mcHost.HostControl.Dialog("Keine Werte gefunden!","Fehler code #1001",1,10,false);
  }
	}
}

Und hier der JS-Teil vom HTML-Code:

<script src="BasicFunctions.js" type="text/javascript"></script>
<script src="Scrolling.js" type="text/javascript"></script>
<script src="MoveFocus.js" type="text/javascript"></script>
<script src="Spinner.js" type="text/javascript"></script>

<script>

	var mceAC3Filter = new ActiveXObject("AC3FilterAddIn.mceAC3Filter");

    function pageLoadFunctions()
	{
        checkSVP();
        setCounter();
        setArray();
        startFocus();
  
  SetSpinnerValue('master',mceAC3Filter.GetValue("master"));
  SetSpinnerValue('clef',mceAC3Filter.GetValue("clev"));
  SetSpinnerValue('slev',mceAC3Filter.GetValue("slev"));
  SetSpinnerValue('lfelev',mceAC3Filter.GetValue("lfelev"));
	}

    function doSelect()
    {
    /* This function determines what your buttons do when they are selected
    (navigate, call a function, etc.). This function will get called whenever user
    clicks a focusable item, or selects it with "OK" button on remote. Make sure to
    include a case below for each focusable item on the page */
        var url = ""
        switch(oCurFocus.id)
        {
            case "btnMainGains": url = "main_gains.htm"; break;
            case "btnChannelGains": url = "channel_gains.htm"; break;
  	case "btnLautsprecher": url = "lautsprecher.htm"; break;
            case "btnAbout": url="about.htm"; break;
  	case "btnSave": SetValue("master");
      	SetValue("clev");
      	SetValue("slev");
      	SetValue("lfelev");
      	url="default.htm"; break;
        }
        if (url != "") window.navigate(url);
    }
	
	<!-- Compares all options of spinner which is given as first parameter (id) with the value -->
	<!-- which is given as second parameter (wert) and sets the spinner to this option. -->
	<!-- If no option of the spinner compares to the value, the spinner is set to "0" and -->
	<!-- an error message appears. -->
	function SetSpinnerValue(id,wert)
	{
  for (i = 0; i < document.getElementById(id).length; ++i)
  {
  	if (document.getElementById(id).options[i].text == wert)
  	{
    document.getElementById(id).options[i].selected = true;
  	}
  	
  	else
  	{
    document.getElementById(id).options[21].selected = true;
    mceAC3Filter.ErrorMessage1001();
  	}
  }
	}
	
	<!-- Saves the Value of the Spinner given in parameter one (id) in the registry. --> 
	function SetValue(id)
	{
  var SpinnerValue = GetSpinnerValue(id);
  mceAC3Filter.SetValue(id,SpinnerValue);
	}
	
	<!-- Gets the Value of the spinner given in parameter one (id). -->
	function GetSpinnerValue(id)
	{
  var Index = document.getElementById(id).selectedIndex;
  var SpinnerValue = document.getElementById(id).options[Index].text;
  return SpinnerValue;
	}

</script>

Das PlugIn habe ich mittels der RegisterMCEApp.exe in MediaCenter registriert und es wird auch beim Start von MediaCenter geladen. Dies erkennt man daran, dass der Test-Dialog erscheint.

Das Problem:

Beim Aufruf der HTML-Seite scheine ich keinen Zugriff auf die öffentlichen Methoden meiner Klasse zu haben, sprich auf die Methoden GetValue, GetStraightValue, SetValue, SetStraightValue, PlayingCheck und ErrorMessage1001.

Was mache ich falsch ? Habe ich in der HTML-Datei was falsch geschrieben ?
Wenn ich versuche, die .dll über regsvr32 im System zu registrieren, bekomme ich die Meldung, dass die Datei zwar geladen wurde, aber der DllRegisterServer-Eingangspunkt nicht gefunden wurde und die Datei deswegen nicht im System registriert werden kann. Im Internet habe ich allerdings gelesen, dass in C# programmierte Librarys garnicht über regsvr32 registriert werden müssen. Über RegisterMCEApp.exe funktioniert das Registrieren ja auch problemlos und das AddIn wird wie man am Dialog-Fenster erkennen kann ja auch erfolgreich in MediaCenter geladen und gestartet. Nur auf meine Methoden komme ich aus meiner HTML-Datei heraus nicht ran. Wieso ?

MfG

Leon

Das Problem:

Bearbeitet von Leon, 04 September 2005 - 05:32 .



klarmobil.de

Konditionen: Telefon-Flatrate in alle dt. Netze, 500 MB Internet-Flat (danach GPRS), O2-Netz, 24 Monate je 19,85 € (Monatsvertrag 24,85 €)

#2
Peacemaker

Peacemaker

    Fingerwundschreiber

  • SpecialMember Pro
  • PIPPIPPIPPIPPIPPIP
  • 1.275 Beiträge
HI


@Leon



Warte mal auf antwort von Olcay er programmiert in C#!

cya

#3
Leon

Leon

    MegaByte Ass

  • SpecialMember Pro
  • PIPPIPPIPPIP
  • 333 Beiträge
Ich bin mir nicht sicher, ob der Fehler in der C# Datei liegt, sprich, dass ich diese so erweitern muss, dass sich die daraus resultierende .DLL über regsvr32 im System registrieren lässt (was ja derzeit nicht geht), oder ob ich beim Versuch die Klassen-Methoden aus dem HTML-File anzusprechen was falsch mache.

Wenn ich dieses Problem irgendwie gelöst bekommen würde, könnte ich so richtig loslegen mit AddIns. Ist schon einiges an Funktionen in Planung für mein erstes Addin. :angry:

MfG

Leon

#4
Peacemaker

Peacemaker

    Fingerwundschreiber

  • SpecialMember Pro
  • PIPPIPPIPPIPPIPPIP
  • 1.275 Beiträge
HI Leon

regsvr32 ist nur für Com Komponenten, für erstellte klassen mit VB.Net ist es regasm.exe und gacutil.exe,



cya

#5
Leon

Leon

    MegaByte Ass

  • SpecialMember Pro
  • PIPPIPPIPPIP
  • 333 Beiträge
Das mit RegASM.exe habe ich inzwischen auch heraus bekommen. Habe mir nun eine .REG Datei aus meiner .DLL erstellen lassen und diese in die Registrierung des MediaCenters eingefügt. Bringt leider auch keine Verbesserungen.

Oder muss ich nochwas anderes machen ? Wozu benötige ich denn gacutil.exe ?

Sieht der Aufruf der Klassen-Methoden in der HTML-Datei oben (bzw. dem JS-Teil) für Dich denn so korrekt aus, oder mache ich einfach beim Aufruf schon einen Fehler ?

Vielleicht poste ich zusätzlich mal meine mceAC3Filter.mcl, kann ja nie schaden:

<application title="mceAC3Filter" 
    id="{CEA2344E-31EF-4136-A865-37373AD3CED3}">
  <entrypoint 
      id="{CEA2344E-31EF-4136-A865-37373AD3CED4}" 
      addin="AC3FilterAddIn.mceAC3Filter, mceAC3Filter" 
      title="mceAC3Filter" 
      description="Virtual Dolby Receiver">
    <category category="Background" />
  </entrypoint>
</application>

Hier die .REG-Datei die RegASM.exe aus meiner Assembly generiert hat:

REGEDIT4

[HKEY_CLASSES_ROOT\AC3FilterAddIn.mceAC3Filter]
@="AC3FilterAddIn.mceAC3Filter"

[HKEY_CLASSES_ROOT\AC3FilterAddIn.mceAC3Filter\CLSID]
@="{5D9B831D-80A9-3558-938A-A1E6BCF830FA}"

[HKEY_CLASSES_ROOT\CLSID\{5D9B831D-80A9-3558-938A-A1E6BCF830FA}]
@="AC3FilterAddIn.mceAC3Filter"

[HKEY_CLASSES_ROOT\CLSID\{5D9B831D-80A9-3558-938A-A1E6BCF830FA}\InprocServer32]
@="C:\WINDOWS\system32\mscoree.dll"
"ThreadingModel"="Both"
"Class"="AC3FilterAddIn.mceAC3Filter"
"Assembly"="mceAC3Filter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v1.0.3705"

[HKEY_CLASSES_ROOT\CLSID\{5D9B831D-80A9-3558-938A-A1E6BCF830FA}\ProgId]
@="AC3FilterAddIn.mceAC3Filter"

[HKEY_CLASSES_ROOT\CLSID\{5D9B831D-80A9-3558-938A-A1E6BCF830FA}\Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]

Dass die generierte CLSID in der .REG-Datei sich von der GUID, welche ich in der mceAC3Filter.mcl sowie der AssemblyInfo.cs gewählt habe, unterscheidet, ist normal, oder ?

MfG

Leon

Bearbeitet von Leon, 04 September 2005 - 19:26 .


#6
Peacemaker

Peacemaker

    Fingerwundschreiber

  • SpecialMember Pro
  • PIPPIPPIPPIPPIPPIP
  • 1.275 Beiträge
HI Leon


Ja, der js code ist in ordnung, aber irgendwie verwechselst du eine Com Klasse mit einem Media-Center Addin!

Zumal schonmal es nicht als Background-Addin regestriert werden darf weil es ja das HTML-GUI besitzt!

Ich würde dir vorschlagen bei Basic für den AC3Filter zu bleiben es ist echt Easy und ich denke damit kommst du auch klar, ist mir eigenltlich nicht klar warum du es in C# neu schreibst, hat doch keinerlei vorteile weil man immernoch auf js und HTML angewiesen ist!

cya

#7
Leon

Leon

    MegaByte Ass

  • SpecialMember Pro
  • PIPPIPPIPPIP
  • 333 Beiträge
Dass regsvr32 nur für COM-Klassen zuständig ist, ist mir nun klar.

Zu Deiner Frage, warum ich nicht bei VB bleibe:
Ich bleibe nicht bei VB, weil ich es nie gemacht habe. Ich befinde mich derzeit auf einer Fortbildungsphase zum Informatiker (Techniker für technische Informatik) wo ich in C++ programmiere. Daher habe ich viel Erfahrung mit dieser Programmiersprache, sprich "Klassen", "Methoden", "Vererbung", "Nutuzng von Pointern" etc. bla bla. ;)
Es ist für mich völlig uneffizient, nur für ein PlugIn nun mit einer neuen Progammiersprache zufangen, wohingegen C++ / C# viel mächtiger sind.

Ih versuche gerade mal die Registrierung über gacutil.exe.

Was ich allerdings nicht ganz verstehe ist, wieso ich das PlugIn nicht als Background Prozess laufen lassen darf ? Wenn ich es als OnDemand AddIn registriere, erziele ich dadurch doch einen gezielten Aufruf des AddIns bzw. der Methode IAddInEntryPoint.Launch an einer bestimmten Stelle in MediaCenter. Das will ich aber ja nicht ! Auf die IAddInEntryPoint.Launch Methode geb ich in meinem konkreten Fall doch überhaupt nichts. Diese ist für mich völlig uninteressant. Was ich will ist, meine Methoden in dieser Klasse jederzeit von außen (in diesem Fall über die ActiveX Schnittstelle) ansprechbar haben und zwar ab dem Zeitpunkt des Starts von MediaCenter. Dieses erreiche ich mit der Registrierung als Backgrund Prozess.

MfG

Leon

#8
scendix

scendix

    Fingerwundschreiber

  • SpecialMember Pro
  • PIPPIPPIPPIPPIPPIP
  • 1.490 Beiträge
  • Geschlecht:Männlich
  • Heimatort:Ebstorf, Lüneburger Heide
  • Interessen:Familie, Programmieren (alle Sprachen, alle Systeme), MCE, ...
deine klasse sollte entweder als background-addin laufen ODER als activex für den zugriff aus html. ein vermischen ist imho nicht vorgesehen.

um auf deine klasse von javascript aus zuzugreifen, muss sie so aussehen:

using System.Runtime.InteropServices;
...

namespace mcePhone
{
	[ComVisible(true)]
	[ClassInterface(ClassInterfaceType.None)]  // <- expose to COM 
	[Guid("B79E5FFD-99D8-4218-AA12-FCF5E86C8AF3")]   // use your OWN guid here
	public class WebLib
	{
...}

...

}


außerdem musst du in den einstellungen des projectes "Für COM-Interop registrieren" auf true schalten (Projekt->Eigenschaften->Konfigurationseigenschaften).

hth
scendix
Mehr Spaß mit MCE Plugins: - Jaast: eBay® im Media Center (kostenlos) - TapiRex: Anrufbenachrichtigung (in MCE) mit Name und Bild - mcePhone for Skype: bringt Skype in das MCE - mceWeather: Wettervorhersage auf Knopfdruck (kostenlos) ... und noch mehr: www.jaast.com

#9
olcay

olcay

    sattelfester Senior

  • SpecialMember Pro
  • PIPPIPPIPPIPPIP
  • 985 Beiträge
  • Geschlecht:Männlich
  • Heimatort:Frankfurt am Main
Leon, habe Dein Projekt etwas abgeändert und paar kleine Fehler korrigiert. Hab Dir auch gleich eine Beispiel HTML geschrieben. Schicke es Dir sobald Du online bist.

Olcay
Eingefügtes Bild Eingefügtes Bild

#10
Leon

Leon

    MegaByte Ass

  • SpecialMember Pro
  • PIPPIPPIPPIP
  • 333 Beiträge
@ scendix:

Hmm... Wenn ich beides nicht mischen darf, dann gehe ich das Problem wohl völlig falsch an. Wie würdest Du das Problem denn angehen, wenn Du ein PlugIn schreiben willst, welches dem Benutzer einer grafische Oberfläsche bieten soll, über die er Einträge in der Registry ändern können soll und wo das PlugIn vor dem Schreiben von Werten in die Registry sicherstellt, dass der PlayState nicht auf "Playing" oder "Paused" steht ?

Ich dachte bisher, dass ich die Grafische Oberfläsche einfach als HTML generiere und die Funktionen zum Lesen aus der / Schreiben in die Registry, prüfen des PlayState sowie zukünftige Funktionen als AddIn in C# schreibe, so wie es im MCE SDK vorgeschlagen wird.

Mir ist dann nur nicht ganz klar, wie ich beides unter einen Hut bringen soll, sprich meinem MCE AddIn eine grafische Oberfläsche bieten soll, wenn nicht über ActiveX. Die einzige Ausgabemöglichkeit über ein reines PlugIn besteht soweit ich das im SDK gelesen haben lediglich in Dialogen, was bedeutet, dass ich wenn ich mehr will eine HTML-Seite entwerfen muss. Nur wie verbinde ich jetzt HTML-Seite mit AddIn bzw. den Methoden im AddIn ?

Ich unterhalte mich dann mal mit olcay. Mal sehen, was er an meinem Projekt geändert hat.

Danke an alle für die tolle Unterstützung ! :wacko:

MfG

Leon

Bearbeitet von Leon, 05 September 2005 - 14:55 .


#11
scendix

scendix

    Fingerwundschreiber

  • SpecialMember Pro
  • PIPPIPPIPPIPPIPPIP
  • 1.490 Beiträge
  • Geschlecht:Männlich
  • Heimatort:Ebstorf, Lüneburger Heide
  • Interessen:Familie, Programmieren (alle Sprachen, alle Systeme), MCE, ...
guck dir mal den parameter "sharedViewport" in den MCL an. wenn du den auf sharedViewport="close" setzt, dann wird der SVP gesclossen, wenn dein plugin vom benutzer aufgerufen wird. und schon brauchst du den playstate nicht mehr zu überwachen...

hth
scendix
Mehr Spaß mit MCE Plugins: - Jaast: eBay® im Media Center (kostenlos) - TapiRex: Anrufbenachrichtigung (in MCE) mit Name und Bild - mcePhone for Skype: bringt Skype in das MCE - mceWeather: Wettervorhersage auf Knopfdruck (kostenlos) ... und noch mehr: www.jaast.com



Ähnliche Themen




Besucher die dieses Thema lesen: 0

Mitglieder: 0, Gäste: 0, unsichtbare Mitglieder: 0