// プロセスを開く 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); } }
// プロセスを閉じる。ちょっとバグがあるので、外からアクセスできないように 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); } }
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 + "ううう"); } }