C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

別exeからプロパティ変数の値を変更したい

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■100857 / inTopicNo.1)  別exeからプロパティ変数の値を変更したい
  
□投稿者/ かねごん (1回)-(2022/11/08(Tue) 16:20:36)

分類:[VB.NET/VB2005 以降] 

Public Class Form1 にて、以下のプロパティ変数を定義したとして(exeファイル名は、Property5.exe)、
	Event PropertyChanged(ByVal sender As Object, ByVal e As EventArgs)

	Private _test As Integer = 1
	Public Property test() As Integer
		Get
			Return _test
		End Get
		Set(ByVal value As Integer)
			_test = value
			RaiseEvent PropertyChanged(Me, New EventArgs)
		End Set
	End Property

別のvb.net のexeから、Property5.exeにある、プロパティ変数 test の値を変更する方法について、教えていただけませんでしょうか?

引用返信 編集キー/
■100861 / inTopicNo.2)  Re[1]: 別exeからプロパティ変数の値を変更したい
□投稿者/ 魔界の仮面弁士 (3486回)-(2022/11/08(Tue) 18:51:43)
No100857 (かねごん さん) に返信
> 別のvb.net のexeから、Property5.exeにある、

別 exe が Property5.exe を参照設定して、その exe から
Property5 側の Form1 を New して呼び出すようにすれば、
そこから test プロパティを自由に操作できますよ。


Public Class Form1
  Private WithEvents child As Property5.Form1

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If child Is Nothing OrElse child.IsDisposed Then
      child = New Property5.Form1()
      child.Text = String.Format("Created at {0:HH\:mm\:ss.ffff}", Now)
    End If
    child.Show(Me)
  End Sub

  Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    If child IsNot Nothing Then
      child.test = Now.Second
    End If
  End Sub

  Private Sub child_PropertyChanged(sender As Object, e As EventArgs) Handles child.PropertyChanged
    Label1.Text = String.Format("Changed at {0:HH\:mm\:ss.ffff}", Now)
  End Sub
End Class
引用返信 編集キー/
■100862 / inTopicNo.3)  Re[1]: 別exeからプロパティ変数の値を変更したい
□投稿者/ radian (100回)-(2022/11/09(Wed) 10:06:31)
No100857 (かねごん さん) に返信
> 別のvb.net のexeから、Property5.exeにある、プロパティ変数 test の値を変更する方法について、教えていただけませんでしょうか?

Property5.exe と別exeが、それぞれ別のプロセスで動作しているという前提なら、直接変更は無理だと思います。
プロセス間通信なりで別exeからデータ受信して、それを元にして更新するといった感じになるのではないでしょうか。

[名前付きパイプを使ったプロセス間通信について]
http://vbnettips.blog.shinobi.jp/other/%E5%90%8D%E5%89%8D%E4%BB%98%E3%81%8D%E3%83%91%E3%82%A4%E3%83%97%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E9%96%93%E9%80%9A%E4%BF%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

[名前付きパイプを利用してプログラム間でデータを受け渡す] ※こちらはC#です
https://www.ipentec.com/document/csharp-interprocess-communication-using-named-pipe


引用返信 編集キー/
■100865 / inTopicNo.4)  Re[2]: 別exeからプロパティ変数の値を変更したい
□投稿者/ 魔界の仮面弁士 (3489回)-(2022/11/09(Wed) 13:42:35)
No100861 (魔界の仮面弁士) に追記
> 別 exe が Property5.exe を参照設定して、その exe から
> Property5 側の Form1 を New して呼び出すようにすれば、
> そこから test プロパティを自由に操作できますよ。

別案。
既に起動済みの Property5.exe を捉えて、test プロパティを操作するパターンです。

呼び出し元で Property5 を参照設定する必要はありませんが、
そのかわりに、Codeer.Friendly.Windows を nuget しておきます。
https://www.codeer.co.jp/CodeAndTool


Option Strict Off
Imports Codeer.Friendly.Dynamic
Imports Codeer.Friendly.Windows
Public Class Form1
  Private App As Codeer.Friendly.Windows.WindowsAppFriend

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim p As Process = Process.GetProcessesByName("Property5").FirstOrDefault()
    If p IsNot Nothing Then
      If DialogResult.No = MessageBox.Show( _
          "起動済みの Property5 (Process:" & CStr(p.Id) & ")に接続しますか?", _
          "接続確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question) Then
        p = Nothing
      End If
    End If
    If p Is Nothing Then
      MessageBox.Show("Property5 を起動して接続します。", "接続確認", MessageBoxButtons.OK, MessageBoxIcon.Information)
      p = Process.Start("D:\Sample\Property5.exe")
    End If
    App = New WindowsAppFriend(p)
  End Sub

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim win = App.Type(Of System.Windows.Forms.Application)()
    Dim forms = win.OpenForms
    Dim f1 = forms("Form1")
    f1.Text = "外部から操作中"
    Label1.Text = "元々の値:" & f1.test.ToString()
    f1.test = CInt(Now.ToString("HHmmssfff"))
    Label2.Text = "新しい値:" & f1.test.ToString()
  End Sub
End Class
引用返信 編集キー/
■100866 / inTopicNo.5)  Re[3]: 別exeからプロパティ変数の値を変更したい
□投稿者/ radian (101回)-(2022/11/09(Wed) 15:42:01)
No100865 (魔界の仮面弁士 さん) に返信
> 別案。
> 既に起動済みの Property5.exe を捉えて、test プロパティを操作するパターンです。
>
> 呼び出し元で Property5 を参照設定する必要はありませんが、
> そのかわりに、Codeer.Friendly.Windows を nuget しておきます。
> https://www.codeer.co.jp/CodeAndTool
>
>
> Option Strict Off
> Imports Codeer.Friendly.Dynamic
> Imports Codeer.Friendly.Windows
> Public Class Form1
>   Private App As Codeer.Friendly.Windows.WindowsAppFriend
>
>   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
>     Dim p As Process = Process.GetProcessesByName("Property5").FirstOrDefault()
>     If p IsNot Nothing Then
>       If DialogResult.No = MessageBox.Show( _
>           "起動済みの Property5 (Process:" & CStr(p.Id) & ")に接続しますか?", _
>           "接続確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question) Then
>         p = Nothing
>       End If
>     End If
>     If p Is Nothing Then
>       MessageBox.Show("Property5 を起動して接続します。", "接続確認", MessageBoxButtons.OK, MessageBoxIcon.Information)
>       p = Process.Start("D:\Sample\Property5.exe")
>     End If
>     App = New WindowsAppFriend(p)
>   End Sub
>
>   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
>     Dim win = App.Type(Of System.Windows.Forms.Application)()
>     Dim forms = win.OpenForms
>     Dim f1 = forms("Form1")
>     f1.Text = "外部から操作中"
>     Label1.Text = "元々の値:" & f1.test.ToString()
>     f1.test = CInt(Now.ToString("HHmmssfff"))
>     Label2.Text = "新しい値:" & f1.test.ToString()
>   End Sub
> End Class

おお、これはすごい。
どういう仕組みで実現してるんでしょうね。
引用返信 編集キー/
■100867 / inTopicNo.6)  Re[4]: 別exeからプロパティ変数の値を変更したい
□投稿者/ 魔界の仮面弁士 (3490回)-(2022/11/09(Wed) 15:54:52)
No100866 (radian さん) に返信
> どういう仕組みで実現してるんでしょうね。

https://ishikawa-tatsuya.hatenablog.com/entry/2019/01/05/140805
引用返信 編集キー/
■100868 / inTopicNo.7)  Re[3]: 別exeからプロパティ変数の値を変更したい
□投稿者/ kiku (306回)-(2022/11/10(Thu) 11:47:42)
2022/11/10(Thu) 11:48:16 編集(投稿者)
No100865 (魔界の仮面弁士 さん) に返信
> ■No100861 (魔界の仮面弁士) に追記
>>別 exe が Property5.exe を参照設定して、その exe から
>>Property5 側の Form1 を New して呼び出すようにすれば、
>>そこから test プロパティを自由に操作できますよ。

興味があったので、C#ですが同じようなサンプルで動作確認してみました。
操作できました。感動。

操作される側
    public partial class Form1 : Form
    {
        string _Test;
        public string Test {
            get
            {
                return this._Test;
            }
            set
            {
                this._Test = value;
                label1.Text = _Test;
            }
        }
    }

操作する側
        private void button1_Click(object sender, EventArgs e)
        {
            var p = Process.GetProcessesByName("WindowsFormsApp1").FirstOrDefault();
            if(p == null)
            {
                Console.Write("●プロセスが見つからない");
                return;
            }

            using (var App = new WindowsAppFriend(p))
            {
                var win = App.Type<System.Windows.Forms.Application>();
                var forms = win.OpenForms;
                var f1 = forms["Form1"];
                f1.Test = "test";
            }
        }

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ