その他

TypeLibraryから列挙型の情報を取得するC#コード

Excel Q&Aサロンに「列挙型の一覧データを取得したい」との質問がありました。

この手の処理は「組み込み定数を列挙するVBAマクロ」でも使用していますが、TypeLib Information(tlbinf32.dll)を利用するのが簡単です。

ただし、tlbinf32.dllは「Windows Vista および Windows Server 2008 に対する Visual Basic 6.0 のサポートに関する声明」にあるように、Windows Vista以降、すでにサポートされていませんので、今回は別の方法を考えてみることにしました。

参考にしたのはこちら↓のページ。

・タイプライブラリ
http://eternalwindows.jp/com/auto/auto02.html

LoadTypeLibでTypeLibraryを取得して、GetTypeInfoやらGetVarDescやらを使っていけば、処理できそうな感じです。

ただ、これをVBAでやるとシンドそうだったので、今回はC#を使うことにします。

using System;
using System.Runtime.InteropServices;
using ComTypes = System.Runtime.InteropServices.ComTypes;

namespace ListTypeLibInfo
{
  class Program
  {
    [DllImport("oleaut32.dll", PreserveSig=false)]
    public static extern ComTypes.ITypeLib LoadTypeLib([In, MarshalAs(UnmanagedType.LPWStr)] string typelib);
    
    public static void Main(string[] args)
    {
      ComTypes.ITypeLib lib;
      try {
        lib = LoadTypeLib(@args[0]);
      } catch (Exception ex) {
        Console.WriteLine("Error:" + ex.Message);
        //Console.ReadKey(true);
        return;
      }
      for (int i = 0; i < lib.GetTypeInfoCount(); i++) {
        IntPtr ppta;
        ComTypes.ITypeInfo info;
        int con;
        string sname, doc, hlp;
        lib.GetTypeInfo(i, out info);
        info.GetDocumentation(-1, out sname, out doc, out con, out hlp);
        info.GetTypeAttr(out ppta);
        try {
          ComTypes.TYPEATTR ta = (ComTypes.TYPEATTR)Marshal.PtrToStructure(ppta, typeof(ComTypes.TYPEATTR));
          if (ta.typekind == ComTypes.TYPEKIND.TKIND_ENUM) {
            for (int j = 0; j < ta.cVars; j++) {
              IntPtr ppvd;
              int pcnames;
              string[] names = {string.Empty};
              info.GetVarDesc(j, out ppvd);
              try {
                ComTypes.VARDESC vd = (ComTypes.VARDESC)Marshal.PtrToStructure(ppvd, typeof(ComTypes.VARDESC));
                info.GetNames(vd.memid, names, 1, out pcnames);
                Console.WriteLine("{0}\t{1}\t{2}", sname, names[0], Marshal.GetObjectForNativeVariant(vd.desc.lpvarValue));
              } finally {
                info.ReleaseVarDesc(ppvd);
              }
            }
          }
        } finally {
          info.ReleaseTypeAttr(ppta);
        }
      }
      //Console.Write("Press any key to continue . . . ");
      //Console.ReadKey(true);
    }
  }
}

こんな感じでしょうか?
構造体の解放処理あたりが特に自信ありませんが、実行すると一応指定したライブラリの列挙型の情報を抜き出してくれます。

ListTypeLibInfo_01

しかしながら、実際にやってみて思ったことは、やはり「TypeLib Information(tlbinf32.dll)を使った方が楽!」だということです。

tlbinf32.dllはoleaut32.dllのラッパーだと思いますが、TypeLibraryの情報を抜き出したいときはホント便利だと思います。

プリキュアオールスターズの映画を観てきました。前のページ

【オトカドール】あそべるお店マップ「オトカマップ」を作ったよ。次のページ

関連記事

  1. その他

    Visual Studio Codeの使い方メモ

    ここではVisual Studio Code(Windows版)を使っ…

  2. その他

    Photoshop CSのライセンス認証問題

    今更ながらに、10年ほど前に発売された「Photoshop CS」をイ…

  3. Office関連

    オデッセイ コミュニケーションズ主催のExcel VBA入門セミナーに参加しました。

    今月19日に開催されたオデッセイ コミュニケーションズさん主催の「Ex…

  4. その他

    Windows Azure MSDN 特典をアクティブ化しました。

    MSDN サブスクリプションの特典でWindows Azureが使える…

  5. Microsoft Designer

    Microsoft Designerの紹介

    「Microsoft Ignite 2022」で発表されたサービス「M…

  6. Windows 10

    Windows Application Driverを試してみました。

    Build 2016のセッション「UI Test Automation…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP