プログラミング覚書

しばらくTwitterのような記事の書き方を採用します。

.NET

[ リスト | 詳細 ]

記事検索
検索

全1ページ

[1]

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が終了するようになりました!
このようなことがわかっても普遍的な価値がありませんし、一時的に役に立つだけです。
まあ、推理力の訓練、発想の訓練になるというところでしょうか。

良い技術情報のあるサイトを見つけました。

http://japan.internet.com/column/developer/

大概コードも記載されているの大きいですね。

解説だけでなくコードがあるとしきいが低くなり、理解し取り入れやすくなります。

MSのVC++のMFCは習得が難しいところがありました。またMFCフレームワークの縛りが強く作法どおりしないうまく動作しませんでした。MSはMFCは自由度が高いといってしましたが、実際にはかなり自由度が低かったのです。
その結果、MFCは現在ではあまり使用されていません。

WEBアプリ作成において.NET FRAMEWORKはMFCと同様、フレームワークの縛りが強くすっきり思い
通りに作成ができません。
また、グリッドコントロールの使い方が複雑で設計が疑問です。

まだ、.NET FRAMEWORKの経験は浅いのではっきりしたことはいえませんが、そんな感触です。

ただし、WEBアプリでなくWindowsアプリということであれば使いやすいようです。
最近はWEBアプリでは複雑な画面は作りにくいため、Windowsアプリへの回帰があるようです。
Windowsアプリといっても、.NET FRAMEWORK上なのでHTTP通信、メールの送受信、その他通信はMFCよりはるかに簡単にできます。

MFC:VC++に付属する主にWindowsアプリケーション用のクラスライブラリ

全1ページ

[1]


.
sya*i99
sya*i99
男性 / 非公開
人気度
Yahoo!ブログヘルプ - ブログ人気度について
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

標準グループ

時事問題

IT

Yahoo!からのお知らせ

よしもとブログランキング

もっと見る

[PR]お得情報

いまならもらえる!ウィスパーうすさら
薄いしモレを防ぐ尿ケアパッド
話題の新製品を10,000名様にプレゼント
いまならもらえる!ウィスパーWガード
薄いしモレを防ぐパンティライナー
話題の新製品を10,000名様にプレゼント
ふるさと納税サイト『さとふる』
実質2000円で特産品がお手元に
11/30までキャンペーン実施中!

その他のキャンペーン


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事