┏第30号━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃         .NETプログラミング研究         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ──<メニュー>─────────────────────── ■.NET Tips ・型のメンバを動的に呼び出す ■.NET質問箱 ・フォームに配置されているコントロールを名前で探すには? ・.NET Compact Frameworkで二重起動を禁止するには? ─────────────────────────────── ─────────────────────────────── ■.NET Tips ─────────────────────────────── ●型のメンバを動的に呼び出す ここでは、Typeオブジェクトで表された型のインスタンスの作成、メ ソッドの呼び出し、プロパティ、フィールドの設定と取得の方法につ いて説明します。 まず、次のようなクラスが宣言されているものとします。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Namespace MyNamespace Public Class [MyClass] 'フィールド Private PrivateField As Integer Public StringArray() As String 'プロパティ Public Property PublicProperty() As Integer Get Return PrivateField End Get Set(ByVal Value As Integer) PrivateField = Value End Set End Property 'インデクサ Default Public Property Item(ByVal index As Integer) As String Get Return index.ToString() End Get Set(ByVal Value As String) End Set End Property 'コンストラクタ Public Sub New(ByVal val As Integer) PrivateField = val StringArray = New String() {"1", "2", "3"} End Sub Public Sub New() PrivateField = 0 StringArray = New String() {"1", "2", "3"} End Sub 'メソッド Public Overloads Function PublicMethod( _ ByVal num1 As Integer, ByVal num2 As Integer) As String Return (num1 - num2).ToString() End Function Public Overloads Function PublicMethod( _ ByVal num1 As Integer) As String Return num1.ToString() End Function Public Overloads Function PublicMethod() As String Return PublicMethod(0) End Function '静的メソッド Public Overloads Shared Function StaticMethod( _ ByVal num1 As Integer, ByVal num2 As Integer) As Integer Return num1 + num2 End Function Public Overloads Shared Function StaticMethod( _ ByVal num1 As Integer, ByVal num2 As Integer, _ ByRef num3 As Integer) As Integer Dim sum As Integer = num1 + num2 + num3 num3 = num1 - num2 - num3 Return sum End Function End Class End Namespace ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ namespace MyNamespace { public class MyClass { //フィールド private int PrivateField; public string[] StringArray; //プロパティ public int PublicProperty { get { return PrivateField; } set { PrivateField = value; } } //インデクサ public string this[int index] { get { return index.ToString(); } set { } } //コンストラクタ public MyClass(int val) { PrivateField = val; StringArray = new string[] {"1", "2", "3"}; } public MyClass() { PrivateField = 0; StringArray = new string[] {"1", "2", "3"}; } //メソッド public string PublicMethod(int num1, int num2) { return (num1 - num2).ToString(); } public string PublicMethod(int num1) { return num1.ToString(); } public string PublicMethod() { return PublicMethod(0); } //静的メソッド public static int StaticMethod(int num1, int num2) { return num1 + num2; } public static int StaticMethod( int num1, int num2, ref int num3) { int sum = num1 + num2 + num3; num3 = num1 - num2 - num3; return sum; } } } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Typeオブジェクトのメンバを呼び出すには、InvokeMemberメソッドを 使用します。InvokeMemberメソッドにより、インスタンスの作成、メ ソッドの呼び出し、プロパティ、フィールドの設定と取得がすべてで きます。 次にInvokeMemberメソッドを用いて、MyClassクラスのメンバを呼び出 す例を示します。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 'Imports System.Reflection 'が宣言されているものとする Dim num As Integer Dim str As String 'MyClassクラスのTypeオブジェクトを取得する Dim t As Type = GetType(MyNamespace.MyClass) '***** インスタンスの作成 ***** 'MyClassのインスタンスを作成 'target = New MyNamespace.MyClass(100) 'と同等 Dim target As Object = t.InvokeMember(Nothing, _ BindingFlags.CreateInstance, _ Nothing, _ Nothing, _ New Object() {100}) '***** メソッドの実行 ***** 'PublicMethodメソッドを実行 'str = target.PublicMethod(12) 'と同等 str = CStr(t.InvokeMember("PublicMethod", _ BindingFlags.InvokeMethod, _ Nothing, _ target, _ New Object() {12})) '静的メソッドStaticMethodを実行 'num = MyNamespace.MyClass.StaticMethod(1, 2) 'と同等 num = CInt(t.InvokeMember("StaticMethod", _ BindingFlags.InvokeMethod, _ Nothing, _ Nothing, _ New Object() {1, 2})) 'refパラメータで返される値を取得 'num = MyNamespace.MyClass.StaticMethod(1, 2, 0) 'と同等 Dim objs() As Object = {1, 2, 0} num = CInt(t.InvokeMember("StaticMethod", _ BindingFlags.InvokeMethod, _ Nothing, _ Nothing, _ objs)) 'refパラメータで受け取った値を表示 Console.WriteLine(objs(2)) 'パラメータの名前でパラメータを指定する 'str = target.PublicMethod(num2:=5, num1:=7) 'と同等 str = CStr(t.InvokeMember("PublicMethod", _ BindingFlags.InvokeMethod, _ Nothing, target, _ New Object() {5, 7}, _ Nothing, _ Nothing, _ New String() {"num2", "num1"})) '***** プロパティの設定と取得 **** 'PublicPropertyプロパティを設定 'target.PublicProperty = 100 'と同等 t.InvokeMember("PublicProperty", _ BindingFlags.SetProperty, _ Nothing, _ target, _ New Object() {100}) 'PublicPropertyプロパティを取得 'num = target.PublicProperty 'と同等 num = CInt(t.InvokeMember("PublicProperty", _ BindingFlags.GetProperty, _ Nothing, _ target, _ Nothing)) 'インデクサの指定したインデックスの要素を設定 'target(1) = "two" 'と同等 t.InvokeMember("Item", _ BindingFlags.SetProperty, _ Nothing, _ target, _ New Object() {1, "two"}) 'インデクサの指定したインデックスの要素を取得 'str = target(1) 'と同等 str = CStr(t.InvokeMember("Item", _ BindingFlags.GetProperty, _ Nothing, _ target, _ New Object() {1})) '***** フィールドの設定と取得 ***** 'PrivateFieldフィールドを設定 'target.PrivateField = 0 'と同等(ただし、通常プライベートフィールドにはアクセス不可) t.InvokeMember("PrivateField", _ BindingFlags.Public Or BindingFlags.NonPublic Or _ BindingFlags.Instance Or BindingFlags.SetField, _ Nothing, _ target, _ New Object() {0}) 'PrivateFieldフィールドを取得 'num = target.PrivateField 'と同等(ただし、通常プライベートフィールドにはアクセス不可) num = CInt(t.InvokeMember("PrivateField", _ BindingFlags.Public Or BindingFlags.NonPublic Or _ BindingFlags.Instance Or BindingFlags.GetField, _ Nothing, _ target, _ Nothing)) '配列StringArrayフィールドの0番目の値を設定 'target.StringArray(0) = "ゼロ" 'と同等 t.InvokeMember("StringArray", _ BindingFlags.SetField, _ Nothing, _ target, _ New Object() {0, "ゼロ"}) '配列StringArrayフィールドの0番目の値を取得 'str = target.StringArray(0) 'と同等 str = CStr(t.InvokeMember("StringArray", _ BindingFlags.GetField, _ Nothing, _ target, _ New Object() {0})) ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ //using System.Reflection; //が宣言されているものとする int num; string str; //MyClassクラスのTypeオブジェクトを取得する Type t = typeof(MyNamespace.MyClass); //***** インスタンスの作成 ***** //MyClassのインスタンスを作成 //target = new MyNamespace.MyClass(100) //と同等 object target = t.InvokeMember(null, BindingFlags.CreateInstance, null, null, new object[] {100}); //***** メソッドの実行 ***** //PublicMethodメソッドを実行 //str = target.PublicMethod(12) //と同等 str = (string) t.InvokeMember("PublicMethod", BindingFlags.InvokeMethod, null, target, new object[] {12}); //静的メソッドStaticMethodを実行 //num = MyNamespace.MyClass.StaticMethod(1, 2) //と同等 num = (int) t.InvokeMember("StaticMethod", BindingFlags.InvokeMethod, null, null, new object[] {1, 2}); //refパラメータで返される値を取得 //num = MyNamespace.MyClass.StaticMethod(1, 2, ref 0) //と同等 object[] objs = new object[] {1, 2, 0}; num = (int) t.InvokeMember("StaticMethod", BindingFlags.InvokeMethod, null, null, objs); //refパラメータで受け取った値を表示 Console.WriteLine(objs[2]); //パラメータの名前でパラメータを指定する //str = target.PublicMethod(num2:=5, num1:=7) //と同等 str = (string) t.InvokeMember("PublicMethod", BindingFlags.InvokeMethod, null, target, new object[] {5, 7}, null, null, new string[] {"num2", "num1"}); //***** プロパティの設定と取得 **** //PublicPropertyプロパティを設定 //target.PublicProperty = 100 //と同等 t.InvokeMember("PublicProperty", BindingFlags.SetProperty, null, target, new object[] {100}); //PublicPropertyプロパティを取得 //num = target.PublicProperty //と同等 num = (int) t.InvokeMember("PublicProperty", BindingFlags.GetProperty, null, target, null); //インデクサの指定したインデックスの要素を設定 //target[1] = "two" //と同等 t.InvokeMember("Item", BindingFlags.SetProperty, null, target, new object[] {1, "two"}); //インデクサの指定したインデックスの要素を取得 //str = target[1] //と同等 str = (string) t.InvokeMember("Item", BindingFlags.GetProperty, null, target, new object[] {1}); //***** フィールドの設定と取得 ***** //PrivateFieldフィールドを設定 //target.PrivateField = 0 //と同等(ただし、通常プライベートフィールドにはアクセス不可) t.InvokeMember("PrivateField", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetField, null, target, new object[] {0}); //PrivateFieldフィールドを取得 //num = target.PrivateField //と同等(ただし、通常プライベートフィールドにはアクセス不可) num = (int) t.InvokeMember("PrivateField", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, target, null); //配列StringArrayフィールドの0番目の値を設定 //target.StringArray[0] = "ゼロ" //と同等 t.InvokeMember("StringArray", BindingFlags.SetField, null, target, new object[] {0, "ゼロ"}); //配列StringArrayフィールドの0番目の値を取得 //str = target.StringArray[0] //と同等 str = (string) t.InvokeMember("StringArray", BindingFlags.GetField, null, target, new object[] {0}); ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 上記のようにType.InvokeMemberメソッドを使う以外に、MethodInfo、 ConstructorInfoクラスのInvokeメソッドを使ってメソッドやコンスト ラクタを呼び出したり、PropertyInfo、FieldInfoクラスのSetValue、 GetValueメソッドを使ってプロパティやフィールドの値を取得、設定 することもできます。 次にこれらの方法を使った簡単な例を示します。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 'Imports System.Reflection 'が宣言されているものとする 'MyClassクラスのTypeオブジェクトを取得する Dim t As Type = GetType(MyNamespace.MyClass) '***** インスタンスの作成 ***** Dim ci As ConstructorInfo = _ t.GetConstructor(New Type() {GetType(Integer)}) Dim target As Object = ci.Invoke(New Object() {5}) '***** メソッドの実行 ***** Dim mi As MethodInfo = t.GetMethod("PublicMethod", New Type() {}) Dim str As String = CStr(mi.Invoke(target, New Object() {})) '***** プロパティの設定と取得 **** Dim pi As PropertyInfo = t.GetProperty("PublicProperty") pi.SetValue(target, 1, Nothing) Dim num As Integer = CInt(pi.GetValue(target, Nothing)) '***** フィールドの設定と取得 **** Dim fi As FieldInfo = t.GetField("PrivateField", _ BindingFlags.Public Or BindingFlags.NonPublic Or _ BindingFlags.Instance) fi.SetValue(target, -1) num = CInt(fi.GetValue(target)) ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ //using System.Reflection; //が宣言されているものとする //MyClassクラスのTypeオブジェクトを取得する Type t = typeof(MyNamespace.MyClass); //***** インスタンスの作成 ***** ConstructorInfo ci = t.GetConstructor(new Type[] {typeof(int)}); object target = ci.Invoke(new object[] {5}); //***** メソッドの実行 ***** MethodInfo mi = t.GetMethod("PublicMethod", new Type[] {}); string str = (string) mi.Invoke(target, new object[] {}); //***** プロパティの設定と取得 **** PropertyInfo pi = t.GetProperty("PublicProperty"); pi.SetValue(target, 1, null); int num = (int) pi.GetValue(target, null); //***** フィールドの設定と取得 **** FieldInfo fi = t.GetField("PrivateField", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); fi.SetValue(target, -1); num = (int) fi.GetValue(target); ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ さらにインスタンスの作成は、AppDomain.CreateInstanceメソッド、 Assembly.CreateInstanceメソッドや、Activator.CreateInstanceメソ ッド(配列を作成するときは、Array.CreateInstanceメソッド)など を使用することによっても可能です。(一般的によく使われているの は、Activator.CreateInstanceメソッドです。) 補足: ここで紹介したように、コンパイル時に型が不明であるオブジェクト をObject型変数に代入し、実行時にそのメソッドやプロパティなどを 呼び出す方法を、遅延バインディングと呼びます(これに対して、コ ンパイル時に型が明確に宣言された変数にオブジェクトが代入される 時は、事前バインディングされます)。VB.NETでは、Option Strictス テートメントをOffにすることにより(あるいは、コンパイラオプショ ンに"/optionstrict-"を指定)、暗黙の遅延バインディングを使用で きますので、InvokeMemberメソッドを使ってメソッドやプロパティを 呼び出す必要がなくなります。 VB.NETの暗黙の遅延バインディングにより、メソッドやプロパティを 呼び出す例を以下に示します。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 'Imports System.Reflection 'が宣言されているものとする Dim num As Integer Dim str As String 'MyClassクラスのTypeオブジェクトを取得する Dim t As Type = GetType(MyNamespace.MyClass) 'MyClassのインスタンスを作成 Dim target As Object = t.InvokeMember(Nothing, _ BindingFlags.CreateInstance, _ Nothing, _ Nothing, _ New Object() {100}) 'PublicMethodメソッドを実行 num = target.PublicMethod(12) '***** プロパティの設定と取得 **** 'PublicPropertyプロパティを設定 target.PublicProperty = 100 'インデクサの指定したインデックスの要素を取得 str = target(1) ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ─────────────────────────────── ■.NET質問箱 ─────────────────────────────── 「.NET質問箱」では、「どぼん!のプログラミング掲示板」に書き込 まれた.NETプログラミングに関する投稿をQ&A形式にまとめ、紹介 します。 [URL]どぼん!のプログラミング掲示板 http://dobon.net/vb/bbs.html ●フォームに配置されているコントロールを名前で探すには? 【質問】 フォームに配置されているコントロールをその名前(文字列)で探し、 アクセスしたいのですが、どのようにすればよいのでしょうか? 【回答】 Visual Studio .NETのフォームデザイナなどを使ってフォームにコン トロールを追加した時、コントロールの"(Name)"プロパティに指定さ れた名前と同じ名前のフィールドがフォームクラスに追加され、この フィールドにそのコントロールのオブジェクトが格納されます(*1)。 つまり、フォームクラスのフィールドを名前で探し、見つかればその フィールドの値を取得するという方法で問題が解決できそうです。そ のためには、上で説明したリフレクションの知識が役に立ちます。 (*1)VB.NETでは、WithEventsが付いていると、フィールドの名前は "(Name)"の頭に"_"が付いた名前になり、"(Name)"はプロパティの名前 となります。 フォームに配置されたコントロールを名前で探すメソッドの例を紹介 します(FindControlByFieldNameメソッド)。このメソッドをコント ロールを検索したいフォームのクラスに書き足してください。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ''' ''' このフォームに配置されているコントロールを名前で探す ''' (フォームクラスのフィールドをフィールド名で探す) ''' ''' コントロール(フィールド)の名前 ''' 見つかった時は、コントロールのオブジェクト。 ''' 見つからなかった時は、null(VB.NETではNothing)。 Public Function FindControlByFieldName(ByVal name As String) As Object 'まずプロパティ名を探し、見つからなければフィールド名を探す Dim t As System.Type = Me.GetType() Dim pi As System.Reflection.PropertyInfo = _ t.GetProperty(name, _ System.Reflection.BindingFlags.Public Or _ System.Reflection.BindingFlags.NonPublic Or _ System.Reflection.BindingFlags.Instance Or _ System.Reflection.BindingFlags.DeclaredOnly) If Not pi Is Nothing Then Return pi.GetValue(Me, Nothing) End If Dim fi As System.Reflection.FieldInfo = _ t.GetField(name, _ System.Reflection.BindingFlags.Public Or _ System.Reflection.BindingFlags.NonPublic Or _ System.Reflection.BindingFlags.Instance Or _ System.Reflection.BindingFlags.DeclaredOnly) If fi Is Nothing Then Return Nothing End If Return fi.GetValue(Me) End Function ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ /// /// このフォームに配置されているコントロールを名前で探す /// (フォームクラスのフィールドをフィールド名で探す) /// /// コントロール(フィールド)の名前 /// 見つかった時は、コントロールのオブジェクト。 /// 見つからなかった時は、null(VB.NETではNothing)。 public object FindControlByFieldName(string name) { System.Type t = this.GetType(); System.Reflection.FieldInfo fi = t.GetField( name, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.DeclaredOnly); if (fi == null) return null; return fi.GetValue(this); } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 次に、"TextBox1"という名前のテキストボックスコントロールを探し、 そのTextの内容を変更する例を示します。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ '"TextBox1"という名前のコントロールを探す Dim tb As TextBox = CType(FindControlByFieldName("TextBox1"), TextBox) '"TextBox1"のTextの内容を変更する tb.Text = "*" + tb.Text ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ //"TextBox1"という名前のコントロールを探す TextBox tb = (TextBox) FindControlByFieldName("TextBox1"); //"TextBox1"のTextの内容を変更する tb.Text = "*" + tb.Text; ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 上記の方法で解決できると思いますが、別の方法として、コントロー ルのNameプロパティを調べる方法を紹介します。VS.NETのフォームデ ザイナでコントロールを追加すると、"(Name)"プロパティはそのコン トロールのNameプロパティと同じになりますので、指定された文字列 のNameプロパティを持つコントロールを探して返すメソッドを作成し ます。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ''' ''' フォームに配置されているコントロールを名前で探す ''' ''' コントロールを探すフォーム ''' コントロールの名前 ''' 見つかった時は、コントロールのオブジェクト。 ''' 見つからなかった時は、null(VB.NETではNothing)。 Public Function FindControlByName( _ ByVal ctr As System.Windows.Forms.Control, _ ByVal name As String) As System.Windows.Forms.Control If ctr.Name = name Then Return ctr End If Dim c As System.Windows.Forms.Control For Each c In ctr.Controls Dim res As System.Windows.Forms.Control = _ FindControlByName(c, name) If Not (res Is Nothing) Then Return res End If Next c Return Nothing End Function ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ /// /// フォームに配置されているコントロールを名前で探す /// /// コントロールを探すフォーム /// コントロールの名前 /// 見つかった時は、コントロールのオブジェクト。 /// 見つからなかった時は、null(VB.NETではNothing)。 public System.Windows.Forms.Control FindControlByName( System.Windows.Forms.Control ctr, string name) { if (ctr.Name == name) return ctr; foreach (System.Windows.Forms.Control c in ctr.Controls) { System.Windows.Forms.Control res = FindControlByName(c, name); if (res != null) return res; } return null; } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 使用例は、次のようになります。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ '"TextBox1"という名前のコントロールを探す Dim tb As TextBox = CType(FindControlByName(Me, "TextBox1"), TextBox) '"TextBox1"のTextの内容を変更する tb.Text = "*" + tb.Text ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ //"TextBox1"という名前のコントロールを探す TextBox tb = (TextBox) FindControlByName(this, "TextBox1"); //"TextBox1"のTextの内容を変更する tb.Text = "*" + tb.Text; ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ このFindControlByNameメソッドは、コントロールの子コントロールも 検索しますが、フォームのcomponentsフィールドに追加されるコント ロール(ImageList、ToolTip、NotifyIconなど)は検索しないことに 注意してください。 ○この記事の基になった掲示板のスレッド [題名] コントロール検索 [投稿者(敬称略)] クリリン [URL] http://dobon.net/vb/bbs/log3-1/89.html [題名] コントロール配列 [投稿者(敬称略)] どらごら、よねKEN、クリリン、こど。 [URL] http://dobon.net/vb/bbs/log3-1/584.html ●.NET Compact Frameworkで二重起動を禁止するには? 【質問】 DOBON.NETの「二重起動を禁止する」で紹介されている方法が、.NET Compact Frameworkでは使用できません。.NET Compact Frameworkで二 重起動を禁止するには、どうすればよいのでしょうか? [URL]DOBON.NET .NET Tips - 二重起動を禁止する http://dobon.net/vb/dotnet/process/checkprevinstance.html 【回答】 .NET Compact Frameworkのアプリケーションは、Pocket PCでは、自動 的に二重起動されないようになっています。ただし、Windows CE .NETでは、自分で二重起動をチェックする必要があります。 .NET Compact Frameworkで二重起動を禁止するサンプルがGotDotNetに あります。 [URL]GotDotNet User Sample: Ensure only one instance sample for .NET Compact Framework http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=9a07ca83-0fd2-44b7-82d0-bd3cfa84e294 このサンプルでは、CreateMutex関数を使うことにより、二重起動のチ ェックを行っています。詳しい内容は、このサンプルをご覧ください。 ○この記事の基になった掲示板のスレッド [題名] プログラム二重起動のチェック [投稿者(敬称略)] crow001、なお助、クリリン、管理人、amiga [URL] http://dobon.net/vb/bbs/log3-1/478.html =============================== ■このマガジンの購読、購読中止、バックナンバー、説明に関しては  次のページをご覧ください。  http://www.mag2.com/m/0000104516.htm ■発行人・編集人:どぼん!  (Microsoft MVP for Visual Basic, Oct 2003-Oct 2004)  http://dobon.net  dobon_info@yahoo.co.jp ■ご質問等はメールではなく、掲示板へお願いいたします。  http://dobon.net/vb/bbs.html ■上記メールアドレスへのメールは確実に読まれる保障はありません  (スパム、ウィルス対策です)。メールは下記URLのフォームメール  から送信してください。  http://dobon.net/mail.html Copyright (c) 2003 - 2004 DOBON! All rights reserved. ===============================