ブログ

割とコンピュータよりの情報をお届けします。

2019年6月8日

C#からCOMに接続 CreateObjectとGetObject

C# からCOMオートメーションを使用していたら,いつもはCreateObjectに相当する操作しかしていなかったので,毎回アプリケーションが起動していたが,GetObjectを使用すればすでに起動しているものに接続できる.

C#からCOMオブジェクトを使用したい場合には,サンプルにCreateObjectというものが必ずと言っていいほどでてくる.
しかし,Createと言っているので毎回新しいインスタンスが作成される(アプリケーションが起動する).

いままでそういうものだと思っていたが,どうも違うらしい.
すでに起動したあアプリケーションに接続する方法があるらしい.

ただし,マイクロソフトのサイトに「ほとんどの場合、Office アプリケーションをオートメーションで実行するには CreateObject (Visual Basic) または CoCreateInstance (Visual C++) を使用して Office アプリケーションの新規インスタンスを起動する必要があります。」という仕様になっているという記事があり,万能ではない.

こんな感じ

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private Excel.Application appExcel = null;
        private Excel.Workbook objWorkbook = null;
        private Excel.Worksheet objWorksheet = null;

        public Form1()
        {
            InitializeComponent();

            try
            {
                this.appExcel = (Microsoft.Office.Interop.Excel.Application)Microsoft.VisualBasic.Interaction.GetObject(null, "Excel.Application");
                this.objWorkbook = this.appExcel.ActiveWorkbook;
            }
            catch (Exception)
            {
                this.appExcel = new Excel.Application();
                this.appExcel.Visible = true;
                this.objWorkbook = this.appExcel.Workbooks.Add();
            }

            this.objWorksheet = (Excel.Worksheet)this.objWorkbook.Sheets[1];
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (objWorksheet != null)
            {
                try
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(objWorksheet);
                }
                catch
                {
                }
            }

            /*if (objWorkbook != null)
            {
                try
                {
                    objWorkbook.Close(true, Type.Missing, Type.Missing);
                }
                catch
                {
                }
            }

            if (appExcel != null)
            {
                try
                {
                    appExcel.Quit();
                }
                catch
                {
                }
            }*/
        }

        private Int64 count = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            this.objWorksheet.Range["A1"].Value = count++;
        }
    }
}
 

≫ 続きを読む

2019/06/08 コンピュータ   TakeMe