その他

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. その他

    Microsoft Download Centerのファイルがリンク切れを起こしているときは?

    以前ブログで「Microsoftのサポートページに載っているファイルが…

  2. Office関連

    「NetOffice」で簡単に.NETからOfficeを操作

    ネットで「NetOffice」なるツールがあることを知ったので、早速試…

  3. その他

    HTML5の構文チェックを行う「Validator.nu (X)HTML5 Validator」のW…

    HTML5の構文チェックをしてくれる「Validator.nu (X)…

  4. その他

    【3月のライオン】色紙ARTを買ってみたよ。

    3日に1回は行く近所のイオン。今日もいつものように食玩コーナーをブ…

  5. その他

    テキスト比較ソフト「ちゃうちゃう!」がバージョンアップされました。

    「ちゃうちゃう Word」といったキーワード検索でのアクセスがありまし…

  6. その他

    CodePlex Archiveからのファイルの取り出し方

    数年前まで稼働していた、Microsoftのホスティングサービス「Co…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP