|
文字列で指定したメソッドを呼び出すには?
Type.GetMethod メソッド (String, Type[])
メソッドやプロパティの有無を確認して呼び出すには? |

- >
- コンピュータとインターネット
- >
- コンピュータ
- >
- ソフトウェア
こんにちは、ゲストさん
[ リスト | 詳細 ]
全1ページ
[1]
|
文字列で指定したメソッドを呼び出すには?
Type.GetMethod メソッド (String, Type[])
メソッドやプロパティの有無を確認して呼び出すには? |
|
Windows2008Serverでのことなのですが、C#でOLEオートメーションでEXCELを起動しマクロを呼び出すとEXCELが終了しません。 Windows2003ServerやWindowsXPでは、マクロを呼び出しても終了します。 以下がC#でOLEオートメーションでEXCELを起動しマクロを呼び出すコードです。 void ExcelTest()
{
Excel.Application app = null;
Excel.Workbooks workbooks = null;
// Excel.Application の新しいインスタンスを生成する
app = new Excel.Application();
// Excel を非表示にする
app.Visible = false;
// app から WorkBooks を取得する
workbooks = app.Workbooks;
// Excel ブックをオープンする
workbooks._Open(bookName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
workbooks.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
workbooks = null;
// Excel を終了する
app.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
app = null;
}
OLEオートメーションで起動したEXCELでマクロを呼び出しても、Windows2003ServerやWindowsXPでは問題なく終了します。Windows2008Serverのバグかまたはバグに近い細かい仕様の違いなのでしょう。 まじめに考えても仕方がありません。EXCELにウインドウメッセージの1つであるWM_CLOSEを送って強制終了させることを思いつきました。
using System.ComponentModel;//便宜上ここに書いていますが、クラスの定義の前に記述します。
const int WM_CLOSE = 0x0010;
//PostMessageを使うための記述
[DllImport("user32.dll", SetLastError = true)]
private static extern int PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
void ExcelTest()
{
Excel.Application app = null;
Excel.Workbooks workbooks = null;
// Excel.Application の新しいインスタンスを生成する
app = new Excel.Application();
// Excel を非表示にする
app.Visible = false;
// app から WorkBooks を取得する
workbooks = app.Workbooks;
// Excel ブックをオープンする
workbooks._Open(bookName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
workbooks.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
workbooks = null;
// Excel を終了する
app.Quit();
System.IntPtr hwnd = (System.IntPtr)app.Hwnd;
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
app = null;
PostMessage(hwnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);//EXCELにWM_CLOSEメッセージを送って終了させます。
}
マクロを呼び出してもEXCELが終了するようになりました!このようなことがわかっても普遍的な価値がありませんし、一時的に役に立つだけです。 まあ、推理力の訓練、発想の訓練になるというところでしょうか。 |
|
良い技術情報のあるサイトを見つけました。 |
|
MSのVC++のMFCは習得が難しいところがありました。またMFCフレームワークの縛りが強く作法どおりしないうまく動作しませんでした。MSはMFCは自由度が高いといってしましたが、実際にはかなり自由度が低かったのです。 |
全1ページ
[1]
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
[PR]お得情報