Entwickler-Ecke

Sonstiges (.NET) - Informationen an andere Programm-Instanz weitergeben?


tartare - So 18.02.07 13:40
Titel: Informationen an andere Programm-Instanz weitergeben?
Hallo

ich habe einen Musikplayer programmiert, der nun auch als mein Standardplayer fungieren soll, was ich auch schon eingestellt habe. Nun habe ich festgestellt, dass wenn ich nun mehrere Muskdateien aus dem Explorer starten will sich dementsprechend viele Instanzen öffnen. Gibt es eine gute Möglichkeit eine Hauptinstanz festzulegen an diese die anderen Instanzen ihre StartParamter im string[] args übergeben und sich danach wieder beenden?

Danke im Vorraus
mfg tartare


Christian S. - So 18.02.07 13:43

Hallo!

Vielleicht hilft Dir dieses [http://www.c-sharp-library.de/topic_quotNur+eine+Instanz+pro+Anwendungquot+featuring+IPC_53550.html] Tutorial weiter :)

Grüße
Christian


tartare - So 18.02.07 19:56

Danke für die schnelle Antwort,
habe mich auch gleich damit befasst und es klappt, aber leider nur teilweise. Wenn ich mehrere Dateien im Explorer auswähle und starte gehen manche Parameter einfach flöten und es kommt nur noch die Hälfte oder weniger in der Hauptinstanz an. Gibts dafür ne Erklärung/Lösung?

Danke im Vorraus...
mfg tartare


Christian S. - So 18.02.07 20:02

Ohne Deinen Sourcecode zu sehen, kann ich mir das nicht erklären.


tartare - So 18.02.07 20:25

Wie im Beispiel, nur dass ich nicht Environment.GetCommendlineArgs verwende sondern string[] args.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
 static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            bool createdNew;
            Mutex m = new Mutex(true"84749c3a-b35b-4480-b775-39c1b4e80f91"out createdNew);
            if (createdNew)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1(args));
                m.ReleaseMutex();
            }
            else
            {
                IpcChannel ipc = new IpcChannel("MusikPlayer");
                ChannelServices.RegisterChannel(ipc, false);

                ArgContainer ac=(ArgContainer)Activator.GetObject(typeof(ArgContainer), "ipc://MPlayer/ArgContainer");
                ac.OnAddArgs(args);
            }
        }
    }

    public class ArgContainer : MarshalByRefObject
    {

        public delegate void AddArgs(string[] files);

        public AddArgs OnAddArgs;

        public ArgContainer()
        {

        }
    }



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
private void Form1_Load(object sender, EventArgs e)
        {
      //korrekte Serialisierung von Delegates ermöglichen
      BinaryServerFormatterSinkProvider serverProv = new BinaryServerFormatterSinkProvider();
      serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;

      BinaryClientFormatterSinkProvider clientProv = new BinaryClientFormatterSinkProvider();

      //Channel erstellen
      Dictionary<stringstring> properties = new Dictionary<stringstring>();
      properties["portName"] = "MPlayer";
      IpcChannel ipc = new IpcChannel(properties, clientProv, serverProv);

      //Channel registrieren
      ChannelServices.RegisterChannel(ipc, false);


      //"Vermittlungsobjekt" als Dienst registrieren. 
      RemotingConfiguration.RegisterWellKnownServiceType(typeof(ArgContainer),
          "ArgContainer",
          WellKnownObjectMode.Singleton);

      //Vermittlungsobjekt erstellen
      ArgContainer ac = (ArgContainer)Activator.GetObject(typeof(ArgContainer), "ipc://MPlayer/ArgContainer");

      //Delegat zuweisen
      ac.OnAddArgs += InvokeAddFiles;
        }

 public void InvokeAddFiles(string[] files)
        {
            this.Invoke(new ArgContainer.AddArgs(AddFiles), new object[] { files });
        }

 public void AddFiles(string[] files)
        {
                hinzufuegen(files[0]);//Ist es normal das files.Length immer 0 ist?
        }


Danke im Vorraus
mfg tartare


Christian S. - So 18.02.07 20:36

Und mit GetCommandLineArgs geht es auch nicht?

Ach ja, zu der AddFiles-Funktion: Nein, es ist nicht normal, dass Files immer die Länge 1 hat. ;-)


tartare - So 18.02.07 21:21

Wenn ich GetCommandLineArgs verwende ist files.Length immer 2, der erste ist der Pfad zu Anwendung und der zweite der zur datei, wenn ich string[] args verwende ist Length immer 1 und dieser ist auch der Pfad zur Datei, also ist es egal. Was sollte denn sonst bei Environment.GetCommandLineArgs noch alles rauskommen?

mfg tartare


Christian S. - So 18.02.07 21:27

Hm. Ich bin irgendwie davon ausgegangen, dass der Windows Explorer einfach alle Dateien, die Du öffnen willst, als Parameter anhängt. :gruebel:

Wie genau öffnest Du die Dateien im Explorer?


tartare - So 18.02.07 21:36

Ich selectiere sie, indem ich sie einrahme und dann enter drücke, danach kommen z.Bsp. manchmal nur 4 von 5, oder nur 11 von 16 Dateien an. Das geht anscheinend zu schnell, außerdem bekomme ich manchmal einen unbekannten Software Fehler, und es kommt nur eine Datei oder keine an. Gibt es vielleicht eine Möglichkeit festzustellen welche Dateien im aktuellen Explorer Fenster selektiert sind?

mfg tartare


tartare - Mo 26.02.07 19:32

Weiß jemand wie der Windows Mediaplayer die selektierten Dateien aus dem Explorer kriegt?