ブログ

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

2019/06

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

Openclipart.orgが停止している

無償のクリップアート提供サイトであるOpenclipart.orgが停止している.詳しい理由はわからないが,DDOS攻撃を受けたことをきっかけにサービスを止めて対応を検討しているようだ.

いつもの一時的なメンテナンスだと思って待っていたが,ひと月近く待っていたが,一向に復帰しないところを見ると,運営者側は深刻なことが起こったと考えているようだ.

すぐに復帰すると思っていたので代替策について気にしていなかった.
一部のクリップアートはほかのクリップアート配信サイト(https://publicdomainvectors.org/など)からダウンロードできるようになっているようだ.ただ,Openclipart.orgではsvgファイルとそこから派生させたファイルを簡単にダウンロードできるようになっていたが,そこまでの提供はされていない.

復帰に寄付を募っているようだ

≫ 続きを読む

2019/06/03 日記   TakeMe