C# の JScript で観察した動作を再現しようとしています。IDispatch を使用してメンバーを列挙し、それらを遅延バインディング オブジェクトで呼び出しています。私は完全な C++ 初心者であり、COM が非常に危険なほど十分に知っています。ここに私の質問があります:
- DISPID_VALUE は常にゼロ (0) ですか? (そうらしい)
- COM オブジェクトを呼び出すとき、いつ DISPID_VALUE メンバーを呼び出す必要がありますか? (インターフェイス自体がインデックス化または呼び出されたときのようなもの...?)
- いつ.Itemを呼び出すかについてのルール/ヒントはありますか?
- 以下の例で、BindingFlags.SetProperty が (BindingFlags.InvokeMethod ではなく) .Cells(x, x) で機能するのはなぜですか? _Default(x, x) を呼び出していますか? 項目(x, x)? これを行うことをどのように知っていますか?どのように呼び出しているかを調べるにはどうすればよいですか?
- 遅延バインドされた IDispatch COM オブジェクトの呼び出しに関する適切なドキュメントはありますか?
以下の例では、Excel スプレッドシートのセル 1,1 の値がテキストに設定され、「太字」になっています。
次の WSH JScript を検討してください。
var objExcel = new ActiveXObject("Excel.Application");
objExcel.Workbooks.Add();
objExcel.Visible = true;
objExcel.Cells(1,1).Value = "some test value";
objExcel.Cells(1,1).Font.Bold = true;
この C# コードは同じ結果を生成します (はい、非常に冗長で申し訳ありません)。
Type axType = Type.GetTypeFromProgID("Excel.Application");
object objExcel = Activator.CreateInstance(axType);
object workbooks = objExcel.GetType().InvokeMember("Workbooks", System.Reflection.BindingFlags.GetProperty, null, objExcel, null);
objExcel.GetType().InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty, null, objExcel, new object[] { true });
workbooks.GetType().InvokeMember("Add", System.Reflection.BindingFlags.InvokeMethod, null, workbooks, new object[] { true });
object cell = objExcel.GetType().InvokeMember("Cells", System.Reflection.BindingFlags.GetProperty, null, objExcel, new object[] { 1, 1 });
cell.GetType().InvokeMember("Value", System.Reflection.BindingFlags.SetProperty, null, cell, new object[] { "some test value" });
object font = cell.GetType().InvokeMember("Font", System.Reflection.BindingFlags.GetProperty, null, cell, null);
font.GetType().InvokeMember("Bold", System.Reflection.BindingFlags.SetProperty, null, font, new object[] { true });
時間ができたら、これについてもっと学びたいと考えている方法の 1 つは、ロギング/デバッグで作成する C# COM クラスを JScript で呼び出すことです。