예제 #1
0
    // プロセスを開く
    public void Start()
    {
        try
        {
            var fileProcMap = HmNodeIPCServerListManager.GetExistProcessList();
            // リスト書き込み
            HmNodeIPCServerListManager.WriteProcesMap(fileProcMap);

            // 自分のプロセスだけは除去
            if (fileProcMap.Exists((m) => { return(m.IP == IP); }))
            {
                return;
            }

            //Processオブジェクトを作成
            System.Diagnostics.Process proc = new System.Diagnostics.Process();

            //出力とエラーをストリームに書き込むようにする
            proc.StartInfo.FileName = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + @"\HmNodeProxy.exe";
            string bShow = opt.ShowConsole ? "1" : "0";
            proc.StartInfo.Arguments = IP + " \"" + filename + "\" " + bShow;

            // 以下のものを確立しておかないと、Serverとのリンクが途中で切れる可能性あるので注意
            proc.StartInfo.UseShellExecute = false;

            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.RedirectStandardError  = true;
            proc.StartInfo.RedirectStandardInput  = true;
            proc.OutputDataReceived += proc_OutputDataReceived;
            proc.ErrorDataReceived  += proc_OutputDataReceived;

            //OutputDataReceivedとErrorDataReceivedイベントハンドラを追加

            proc.StartInfo.CreateNoWindow = true;

            //起動
            proc.Start();

            // プロセスのウィンドウが現れるまでまつ
            proc.WaitForShowWindow();

            // リストに追加
            HmNodeIPCServerListManager.AddProcessMap(new HmNodeIPCServerListManager.HmProcessStruct {
                IP = IP, processID = proc.Id
            });

            // Console.WriteLine("実行");
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
    }
예제 #2
0
    // プロセスを閉じる。ちょっとバグがあるので、外からアクセスできないように
    protected void Close()
    {
        HmNodeIPCClient.UnregisterChannnel(IP);

        try
        {
            var fileProcMap = HmNodeIPCServerListManager.GetExistProcessList();

            // HmNodeProxyプロセスを列挙する
            foreach (System.Diagnostics.Process proc in System.Diagnostics.Process.GetProcessesByName("HmNodeProxy"))
            {
                // テキスト内にあるプロセスに対して…
                foreach (var pm in fileProcMap)
                {
                    // 実際に走っているプロセスのIDと一致したら…
                    if (pm.IP == IP && pm.processID == proc.Id)
                    {
                        // ウィンドウが無い場合にそなえてネイティブレベルでWM_CLOSEを送る
                        proc.SendMessageCloseWindow();

                        // 閉じるプロセスだけは除去
                        fileProcMap = fileProcMap.FindAll((m) => { return(m.processID != pm.processID); });

                        // 1つ除去したリストで書き込み
                        HmNodeIPCServerListManager.WriteProcesMap(fileProcMap);

                        // こちらは、IsVisibleでないと機能しない。
                        // proc.CloseMainWindow();
                        break;
                    }
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
예제 #3
0
    public static void Main(string[] args)
    {
        // 引数が2つ必要。1番目のIPで、2番目がnodeに引き渡す.jsのファイル名
        if (args.Length < 3)
        {
            return;
        }

        // 常駐秀丸以外が何も起動していなければ、何もしない。(hideの秀丸も起動しているものとする)
        if (!HidemaruWindowInfo.IsFindWindow())
        {
            return;
        }

        try
        {
            // 1番めの引数にはIPが入っている50000~65535の範囲あたりを想定
            int IP = int.Parse(args[0]);

            bool bShowWindow = int.Parse(args[2]) > 0; // 1ならtrue, 0ならfalse

            // IPCサーバーチャンネルの生成.
            serverChannel = new IpcChannel("localhost:" + IP);

            // リモート用として、サーバーチャンネルを登録
            System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(serverChannel, false);

            // チャンネル名の表示.
            Console.WriteLine("チャンネルの名前は {0}.",
                              serverChannel.ChannelName);

            // チャンネルの優先度.
            Console.WriteLine("チャンネルの優先度は {0}.", serverChannel.ChannelPriority);

            // 該当のチャンネルデータの取得.
            System.Runtime.Remoting.Channels.ChannelDataStore channelData = (System.Runtime.Remoting.Channels.ChannelDataStore)serverChannel.ChannelData;
            // チャンネルの場所表示
            foreach (string uri in channelData.ChannelUris)
            {
                Console.WriteLine("チャンネルのURIは {0}.", uri);
            }

            // リモート呼び出しのため、オブジェクトを登録し、公開。サーバータイプ。シングルトン。
            System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType(
                typeof(HmNodeRemoteObject), HmNodeRemoteObject.Name + IP + ".rem",
                System.Runtime.Remoting.WellKnownObjectMode.Singleton
                );

            // チャンネルの URI を分析.
            string[] urls = serverChannel.GetUrlsForUri(HmNodeRemoteObject.Name + IP + ".rem");
            if (urls.Length > 0)
            {
                string objectUrl = urls[0];
                string objectUri;
                string channelUri = serverChannel.Parse(objectUrl, out objectUri);
                Console.WriteLine("オブジェクトの URI は {0}.", objectUri);
                Console.WriteLine("チェンネルの URI は {0}.", channelUri);
                Console.WriteLine("オブジェクトの URL は {0}.", objectUrl);
            }

            // ユーザーの入力待ち
            // Console.WriteLine("サーバー終了には、リターンキーを入力");


            // Node.JSを、ファイル名やIPを指定して起動
            ProcessNodeJS.Start(args[1], IP, bShowWindow);

            // ShowDialogにすることで、一種モーダルとする。(常駐秀丸以外の)秀丸が無ければ、Close()してくる。
            // 外アプリからClose()した時に、正当な処理が行われるように(nodeもCloseできるように)、Formにしている。
            var f = new HmNodeProxyForm(IP, bShowWindow);
            f.ShowDialog();

            // Node.JSの終了
            ProcessNodeJS.Close();

            // チャンネルの解除
            System.Runtime.Remoting.Channels.ChannelServices.UnregisterChannel(serverChannel);

            HmNodeIPCServerListManager.UpdateProcessMap();

            // Console.WriteLine("サーバーを終了します。");
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message + "ううう");
        }
    }