0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[C#] OfficeのCOMオブジェクトを取得後に、キャストエラー

Last updated at Posted at 2023-01-19

Officeの修復、ライセンス再認証にて解決しました。

Office Home And Business 2019 (クイック実行版、法人向け)にて、プロダクトキーを再認証していたのが原因だったのかもしれません。
単純に、Officeが壊れていた可能性もありそうですが。

  1. Windowsの設定から、アプリ一覧、Officeを選択し、変更。
  2. オンラインから修復 のような選択肢を選び、修復。
  3. 修復終了後に、ライセンスキーを再入力。
  4. 動きました!

以下、症状殴り書き。

using pp = Microsoft.Office.Interop.PowerPoint;
using Microsoft.Office.Core;

private static void GetShapeRange(Action<pp.ShapeRange> callback)
{
    pp.Application? app = null;
    pp.DocumentWindow? win = null;
    try
    {
        // COMオブジェクトの取得。
        // オブジェクト自体の取得は出来ているが、キャストエラー。
        // Common.GetActiveObject()内部でprogID, clsIDがPowerPointと一致しているがキャストエラー
        // PowerPointで確認。
        // 別ののCOM(Excel)取得アプリケーションでもエラー出ていたので、
        // おそらくExcelやWordなども駄目かと思われる。
        app = (pp.Application)Common.GetActiveObject("PowerPoint.Application");

        win = app.ActiveWindow;
    }
    catch (Exception exp)
    { }
    finally
    {
        if (win != null)
            Marshal.ReleaseComObject(win);
        if (app != null)
            Marshal.ReleaseComObject(app);

        win = null;
        app = null;
        GC.Collect();
    }
}

internal static class Common
{
    internal static object GetActiveObject(string progID)
    {
        Guid clsid;
        try
        {
            NM.CLSIDFromProgIDEx(progID, out clsid);
        }
        catch (Exception)
        {
            NM.CLSIDFromProgID(progID, out clsid);
        }
        NM.GetActiveObject(ref clsid, IntPtr.Zero, out object obj);
        return obj;
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?