Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2010年02月19日] [更新 2014年05月11日] コンポーネントのインストール方法(登録方法)等
   
コンポーネントの登録方法等
タイプライブラリ取り込みの他の方法 ( Delphi 2007 - )
動作確認等 Windows 7 U64(SP1) + Delphi 2010(UP5) Pro, Delphi XE Pro



  • 2014年05月11日
  • Windows SDK 8.1 を使用したタイプライブラリの作成の記事を追加




TLIBIMP.EXE を使用したタイプライブラリの取り込み


タイプ ライブラリのインポートは,TLIBIMP ユーティリティでも行えます.これはコマンドラインツールです.以下は Shell32.dll を例にした説明です.

まず任意のフォルダに Shell32.dll をコピーします.Shell32.dll は Windows の System32 ディレクトリにあります.Windows Vista や Windows 7 では,管理者権限で実行しても,システム関係のフォルダにはファイルは作成できません.そのために,別の場所にコピーしました.
出力先だけシステムフォルダ以外にすればいいことですが,コマンドラインの見通しを良くするためです (サイトの記事にする場合,長いと掲載しずらい).
フォルダ名に空白文字が含まれている場合は,コマンドラインに渡す際,ダブルコーテーションで囲むことを忘れないでください.

下の図では,[552_コマンドラインのリダイレクト] で作成したプログラムを利用してコマンドを実行しています.タイプライブラリの取り込みで作成した pas ファイルは,uese して使用します.また,作成した pas ファイル内に Register メソッドがある場合,パッケージに登録することもできます.


[備考 1]
Windows Vista 以降では,システムフォルダ内のファイルの操作には,TrustedInstaller という所有権が必要です.エクスプローラ等で操作するとコピー等が可能ですが,所有権やアクセス権を正しく設定しないと,次回の Windows 起動時に自動修復機能が働く可能性があります.



下の図は,実際の作業の様子です.
コマンドラインは次のようになっています.ここでは,Shell32.dll から取り込んでいます.タイプライブラリファイルである .tlb ファイルから取り込む時は,そのファイルを指定します.
実行すると,.pas ファイルができます.コンポーネントパレットに登録したい場合は,パッケージに登録します.それは,通常のコンポーネントのインストールと同じ作業です.

"C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\bin\tlibimp.exe" -P Shell32.dll

Delphi の IDE では,64 ビット版のタイプライブラリの取り込みはできません.次のように,64 ビット版の tlibimp.exe を使用することになります.

"C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\bin64\tlibimp.exe" -P Shell32.dll

参考までに,各 Delphi の バージョンの TLIBIMP.EXE の場所を示しておきます.いずれも,64 ビット版の Windows の場合です.64 ビット版の TLIBIMP.EXE は bin64 フォルダ内にあります.
32 ビット版の Windows の場合は,C:\Program Files フォルダの階層下となります.

"C:\Program Files (x86)\Borland\Delphi6\Bin\tlibimp.exe"            // Delphi 6
"C:\Program Files (x86)\Borland\Delphi7\Bin\tlibimp.exe"            // Delphi 7
"C:\Program Files (x86)\CodeGear\RAD Studio\5.0\bin\tlibimp.exe"    // Delphi 2007
"C:\Program Files (x86)\CodeGear\RAD Studio\6.0\bin\tlibimp.exe"    // Delphi 2009
"C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\bin\tlibimp.exe" // Delphi 2010
"C:\Program Files (x86)\Embarcadero\RAD Studio\8.0\bin\tlibimp.exe" // Delphi XE
"C:\Program Files (x86)\Embarcadero\RAD Studio\9.0\bin\tlibimp.exe" // Delphi XE2
"C:\Program Files (x86)\Embarcadero\RAD Studio\10.0\bin\tlibimp.exe"// Delphi XE3
"C:\Program Files (x86)\Embarcadero\RAD Studio\11.0\bin\tlibimp.exe"// Delphi XE4
"C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\bin\tlibimp.exe"// Delphi XE5
"C:\Program Files (x86)\Embarcadero\Studio\14.0\bin\tlibimp.exe"    // Delphi XE6


[備考 2]
Shell32.dll は,32 ビット版も 64 ビット版も同じ名前です.
Shell32.dll に限らず,特別な理由がない限り (64 ビット版だけ存在する場合等), dll は 32 ビット用も 64 ビット用も同じ名前です.これにより,リダイレクトしても,使用する dll の名前を変更する必要がありません.


タイプライブラリの取り込み図1 図1
準備
  • 任意のフォルダに Shell32.dll をコピー
  • PipeRedirect01.exe はコマンドラインのリダイレクトプログラム
タイプライブラリの取り込み図2 図2
タイプライブラリ取り込み
  • tlbimp.exe は Delphi インストール先の [bin]フ ォルダ内にある
  • tlbimp.exe はフルパスにしている
タイプライブラリの取り込み図3 図3
Shell32_TLB.pas ができる
  • これをuses して利用する
  • 必要であれば,コンポーネントとしてインストールする




IDL コンパイラを使用したタイプライブラリの作成と取り込み


文字コードの変換等のサンプルでは Mlang.dll の機能を使用しているコードがあります.このタイプライブラリを取り込むために,上の同じ方法(または IDE) で実行しても下図のようにエラーとなってしまいます.


タイプライブラリの取り込み図4 図4
作成できない

このような場合,マイクロソフトが提供している Windows SDK に拡張子が IDL というファイルが提供されていることがあります.IDL (Interface Description Language) はいろいろな開発言語で利用可能なようにした部品のようなものです.これを IDL コンパイラでタイプライブラリに変換します.IDL コパイラも MIDL という名前で SDK で提供されています.
Windows SDK は以下からダウンロードしてインストールします.Windows XP (SP3) にもインストールできます (リンクは 2012年05月10日現在).

.NET Framework 4 のリンクは 7 となっていますが,実際のバージョンは 7.1 です.
.NET Framework 3.5 の方が 7 です.
また,マイクロソフトの Visual C++ をインストールしていると,インストールに失敗することがあるようです.その時は,インストール項目の [Visual C++ Compilers] を選択せずにインストールしてください.必要なコンパイラは Visual C++ に含まれています.
Visual C++ がインストールされていない環境では,この項目のチェックは外せません. 今回の動作確認では,前項の説明と同じように,D ドライブに作業用のフォルダを作成し,ここにMlang.idl をコピーしました.下図は,.NET Framework 3.5 SP1 の場合です.

IDL によるコンパイル作業には C/C++ のプリプロセッサが必要ですが,これは Delphi 2007 以上をインストールした際にマイクロソフトの開発言語のサブセットが同時にインストールされ,そこにも含まれています.今回の作業では,これは使用しません.Visual C++ のプリプロセッサを使用することになります.したがって,Delphi 2007 よりも前のバージョンでも,IDL ファイルからタイプライブラリを作成することができます.



タイプライブラリの取り込み図5 図5
SDKをインストール
  • [include] に Mlang.Idl がある
  • これをコンパイルしてタイプライブラリを作成
  • コンパイルに必要な MIDL.EXE は [Bin] フォルダにある
タイプライブラリの取り込み図8 図6
プリプロセッサ
  • プリプロセッサ cl.exe の場所
  • Microsoft Visual Studio 8 は RAD Studio 用のサブセット
  • このサブセットは,Delphi 2007 以上でインストールされるもの

準備ができたら[スタート]メニューから SDK の [コマンドシェル] を起動します.


タイプライブラリの取り込み図7 図7
SDK のコマンドシェル起動
  • SDK のバージョンによっては
    Windows SDK XX Command Prompt
    という名前のこともある

コマンドシェルを起動したら,以下のコマンドを実行します.コマンドラインのオプションについてはMSDNの記事を参考にしてください.
もし,idl ファイル内のコードを修正している場合は,コマンドを実行する前に,修正した idl ファイルがあるディレクトリに移動しておきます.そうしないと,SDK の Include フォルダ内の idl ファイルを読みに行ってしまいます.


リスト1
IDL コンパイラで Mlang.idl をコンパイルするためのコマンド
コピーして,コマンドシェルのシステムメニューで[ 編集] [貼り付け] すると間違い防止になる
    //コンパイル結果のファイルの出力先は/out に続いてディレクトリで指定
    //コンパイルの対象ファイルを最後にフルパスで指定
  midl /cpp_cmd cl.exe /cpp_opt "/E" /out d:\000 d:\000\Mlang.idl


タイプライブラリの取り込み図8 図8
コマンド文字列を貼り付け
タイプライブラリの取り込み図8 図9
コンパイル成功

コンパイルに成功すると Mlang.tlb というタイプライブラリファイルができます.同時に作成されたその他のファイルは必要ありません.削除します.このファイルを TLIBIMP でコンパイルして,pas ファイルを作成します.


タイプライブラリの取り込み図9 図10
Mlang.tlb ができる
  • Mlang.tlb 以外のファイルは不要
タイプライブラリの取り込み図10 図11
pas ファイル作成
  • tlibimp を使用してタイプライブラリを取り込む
タイプライブラリの取り込み図11 図12
作成した pas ファイル
  • MultiLanguage_TLB.pas という名前のファイルができる
  • これを uses して使用する
  • Mlang.tlb は不要

以上の手順で作成した MultiLanguage_TLB.pas ですが,残念ながらそのままでは使用に耐える状態ではありません.原因は不明ですが,関数や構造体 (レコード型) の引数の型が MSDN の型と微妙に違っています.また現在ではサポートされていないインターフェイスも含まれています.修正が必要です.このような方法もあるという情報提供と理解してください.
たとえ修正が必要だとしても,一からインターフェイスを設計するよりは楽です.修正したファイルはサンプルプログラムに同梱しています.




Windows SDK 8.1 を使用したタイプライブラリの作成


2014年05月11日現在,Windows 8.1 に対応した Windows SDK for Windows 8.1 が提供されています.
Windows SDK for Windows 8.1 は,Windows 7 以降専用です.
以前は,Microsoft Windows SDK for Windows ... という名称でしたが,8.0 からは Windows SDK という名称に変更されています.

この SDK を使用して,IDL ファイルからタイプライブラリ tlb を作成する手順です.
SDK 7.1 までは,必要なコンパイラも含まれていましたが,Windows SDK 8.1 には含まれていません.別途,Visual Studio が必要となりました.
今回は無料の評価版である Microsoft Visual Studio Express 2013 for Windows Desktop を以下のダウンロードサイトからダウンロードしてインストールしました. SDK 8.1 をインストールすると,下図のように,Windows Kits 階層下に各種のヘッダファイルや IDL ファイルが格納されます.

以下の説明では,この中の ShObjidl.idl からタイプライブラリを作成します.
作成したタイプライブラリからタイプライブラリを取り込むと,ShellObjects_TLB.pas というユニットができます.このユニットには,Delphi の ShlObj.pas 内で定義されているインターフェイスと重複する部分が多くあります.したがって,プロジェクトで同時には使用できません.必要なインターフェイス部分だけを取り出して利用することは可能です.

例えば,以下の参考リンクの記事では,ShellObjects_TLB.pas から IDesktopWallpaper インターフェイス部分のコードだけを取り出して利用しています.



タイプライブラリの取り込み図9 図13
Windows 8.1 SDK
  • um フォルダ内に IDL ファイルがある

まず,インストールした Visual Studio のコマンドプロンプトを起動します.
[スタート] メニューから下図のように [Visual Studio ツール] をクリックして開きます.開いたフォルダの中から,[開発者コマンドプロンプト for VS2013] を,管理者権限で起動します.


タイプライブラリの取り込み図9 図14
Visual Studio ツールを開く
タイプライブラリの取り込み図9 図15
コマンドプロンプトを管理者権限で実行する
タイプライブラリの取り込み図9 図16
コマンドプロンプト起動直後

コマンドラインを以下のようにして実行します.
このコマンドは,タイプライブラリ (拡張子は tbl) の出力先を D:\000 とし,ShObjIdl.idl というファイルを IDL コンパイラでコンパイルします.パス名等に空白が含まれる場合は," (ダブルクォーテーション) で囲むことを忘れないでください.空白はコマンドラインの各スイッチ (オプション) の区切り文字として解釈されます.
32 ビット版の Windows では Program Files (x86) ではなく,Program Files となります.


midl /cpp_cmd cl.exe /cpp_opt "/E" /out d:\000 "C:\Program Files (x86)\Windows Kits\8.1\Include\um\ShObjIdl.idl"

SDK 8.1 と Visual Studio が正常にインストールされている場合,ShObjIdl.idl を別の場所にコピーして,次のようなコマンドラインとしてもコンパイルできます.

midl /cpp_cmd cl.exe /cpp_opt "/E" /out d:\000 d:\000\ShObjIdl.idl

コマンドラインの文字列は,テキストエディタ等で作成して,下図のように,コマンドプロンプトに張り付けるとタイピングの間違いを防止できます.


タイプライブラリの取り込み図9 図17
コマンドライン文字列の貼り付け

コンパイルを開始すると,下図のように,コンパイルの経過が表示されます.


タイプライブラリの取り込み図9 図18
コンパイル成功

コンパイルに成功すると,下図のように,コマンドラインで指定した出力先に,タイプライブラリファイルが作成されます.
後は,このファイルから,タイプライブラリの取り込みでユニットを作成します.


タイプライブラリの取り込み図9 図19
タイプライブラリ ShObjIdl.tlb ができる
  • ShObjIdl.tlb 以外は不要


今回インストールした Microsoft Visual Studio Express 2013 for Windows Desktop (VS 2013) ですが,IDE を起動して,[新しいプロジェクト] を選択します.すると,下図のように,開発言語が選択できるようになっています.以前のバージョンでは,Visual Basic, Visual C#, Visula C++ を別々にインストールする必要がありました.統合されたようです.

サンプルプログラム集に,Visual C# 2010 で作成したものがありますが,この VS 2013 でもコンパイルできることを確認しました.

この VS 2013Express エディションは無料の評価版ですが,30 日以内にアカウントを登録しないと使用できなくなります.マイクロソフトのアカウントがない場合は作成します.
アカウントを登録して,サインインします.すると 30 間無料で使用することができます.30 日経過すると,またサインインが必要です.



[備考]
2015年10月30日現在は,30 日経過してもサインインの必要はなくなっています.



タイプライブラリの取り込み図9 図20
VS 2013




IDL ファイルから常にタイプライブラリが作成できるとは限らない


たとえ IDL ファイルがあっても,常にタイプライブラリが作成できるわけではありません.
IDL のコードに library 属性の指定がないと tlb ファイルは作成されません.また,単に library 属性を指定しても,タイプライブラリとして有効なコードが出力されるようになっていないと利用に耐えるコードはできません.もし,IDL にそのような記述がなければ修正しなければなりません.そのためには,インタフェース記述言語 (IDL) の知識が必要となります.