その他

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

    Webサービスのサジェスト機能についてまとめてみました。

    「Bingで期間指定検索するオプション 他」でも紹介していますが、Bi…

  2. その他

    bitlyのAPIキーを取得する

    今回はURL短縮サービスとして有名なbitlyのAPIキーを取得する方…

  3. その他

    iisreset /stop でIISを停止する。

    Apacheを起動しようとするとIISが80ポートを使っているので起動…

  4. その他

    Android版Kindleでダウンロードした本をSDカードに保存できるようになっていた。

    スマホで大量のマンガ技術書を読むのにKindleアプリを愛用しているの…

  5. その他

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

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

  6. 日常

    J:COM NET 光 5Gコース(on auひかり)が開通しました。

    私の自宅では電話、テレビ、インターネット環境をケーブルテレビのJ:CO…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP