10.1. Perl for Win32用のエクステンションを書くには
どうすればいいのですか?
Perl for Win32用のエクステンションを書くのは、標準(standard)perl
のためのエクステンションを書くのと良く似ています。
エクステンションを書きはじめるために、標準ドキュメントにある
paerlpaiとperlgutsのドキュメントから始めましょう。
これは一種、煩わしいことではありますが、ここから始める必要が
あるのです。
perlの性質を把握した後で、Win32用のperlエクステンションの記述に
ついての説明があるwin32xsページをチェックします。基本的にperlインター
プリターはクラスに押し込められている(encapsulated)ので、あなたはpPerl
引数をXS()関数ではない関数それぞれに対してセットアップする必要がありま
す。
#undef sv_2iv
#define sv_2iv CPerl::Perl_sv_2iv
これは実に冴えたトリックですが、物事を複雑にしています。
いずれにしろ、perlの関数を使うfooという関数を使うような場合には
以下の例のように定義しなければならないということを知っておく必要が
あります。
foo( CPerl * pPerl, ... )
{
SV * mySv;
mySv = newSVpv("Bibimbap", 0); //以前と同じように perlの関数を使います
}
そして、次の例のようにして呼び出します
foo( pPerl, other_args ); // pPerlはXS関数の中で定義されています
大雑把に云って、Perl for Win32のエクステンションを記述するには
以下のような段階を踏みます。
-
Perl for Win32のソース配布をダウンロードして、それをビルドします。
-
XSファイルと、エクステンションのためのCあるいはC++によるサポート
ファイルを作成します。詳しくは前述したリストを参照してください。
-
Visual C++であればDLLプロジェクトを作成し、そこにXSファイルと
Cファイルを追加します。XSファイルから生成されたCファイルの名前を
たとえそういったファイルがまだないとしても、
プロジェクトに追加することを忘れないようにしてください。
-
perlのヘッダーファイル(extern.h, perl.h)があなたの環境の
インクルードパスにあることを確認してください
(Visual C++でインクルードパスを設定するには
Tools/Options/Directories を使います)。
-
perl100.libがあなたのライブラリパスにあることを確認してください
(Visual C++でライブラリパスを設定するには
Tools/Options/Directories を使います)。
perl100.libをあなたのビルド設定のリンクタブ中にあるライブラリ
ファイルのリストに追加します。
-
XSUBPPを使ってあなたのXSファイルをCに変換します。
XSUBPPはあなたの使っているperlのディレクトリの
Lib\ExtUtils というサブディレクトリにあります。
これは(perlスクリプトなので)手作業で起動することもできますし、
Visual C++の設定によって、ビルド作業中にXSファイルを自動的に
処理するようにすることもできます。詳しくは
Visual C++ヘルプの“Specifying Custom Build Tools”
を参照してください。
-
XSファイルによって生成されたCファイルに、
エクステンションを初期化するためにXSUBPPが使用する
"boot_"という関数があるかどうかを確認します
-
.defファイル(詳しくはVisual C++ヘルプの“.def Files”を参照して
ください)を作成して、それをプロジェクトに追加します。作成した
.defファイルのEXPORTSセクションに "boot_"関数の名前を
追加します。これは重要なことです。これをきちんと行わなければ
perl.exeはあなたの作成したエクステンションを起動することができ
ないでしょう。
-
あなたのファイルにバージョンスタンプのリソースを付け加えること
で、大きく時間を節約することもできるでしょう。
詳しくはVisual C++のヘルプを参照してください。
-
出力ファイルの名前は、あなたが作成したモジュールの名前
[module]を使った[module].pll とするのがよいでしょう。これは
プロジェクトの設定で指定できます。
-
出力ファイルはperlのあるディレクトリの Lib\Auto\[module]
というサブディレクトリに置くのが良いでしょう
(ここで[module]はあなたのモジュールの名前です)。
これもプロジェクトの設定で指定できます。
-
あなたの作成したエクステンションの初期化(bootstrap)のための
perlファイル [module].pmを作成します。
詳しくはperlapiのドキュメントページを参照してください。
-
あなたのモジュールをテストするためのperlスクリプトを書きます。
-
プロジェクトをビルドして、うまく動作するかを確認するために
テストスクリプトを実行します。
-
デバッグタブでperl.exeをデバッグセッションで使用する実行ファイルに
指定することで、あなたの書いたエクステンションのデバッグをする
ことができます。使用するテストスクリプトを実行ファイルに対する
引数として設定します。
CやC++を使ってエクステンションを作成することはそう簡単ではないと
いうことに注意してください。あなたが思っているよりも多くの
(Windows 用のCプログラムに関する)経験が必要なのです。
[Any other hints/comments? -ESP]
10.2. C/C++ プログラムにPerlインタプリタを埋め込むにはどうすればいいのですか?
それは標準配布パッケージのperlを使ってやる場合とは大きな違いがあります。
ActiveWareはperlインタープリターをC++のクラスに押し込め(encapsulated)
たので、あなたはそのクラスを実体化(instantiate)して、さらに
perlスクリプトを解析し、実行するためにそ実体化したインスタンスを
使うことになります。
perlembedというドキュメントには
“perlmain.cを見て、そこでやっているようにやりなさい”
というたったの一行しかありません。ほとんど何の役にも立たないように
思えるにもかかわらず、筆者はそれをやりましたし、大きな問題もなし
にperlインタープリターを埋め込むことができました
(私はperlmain.cから多くの部分を拝借しました)。
以下に示すステップはあなたのプログラム中でスクリプトを実行するための
手順です。
-
あなたのプログラムの中でperlインタープリターを使う作業コンテキスト
を作るために、IperlSupportから派生したクラスを作成します。
exe-srcディレクトリにあるperlmain.cppの中のCperlExeクラス
のコードをコピーするのが良い出発点となるでしょう。
-
perlのインスタンスを作成するために PerlCreate()関数を呼び出します。
-
ファイルを解析するために引数を付けて PerlParse()関数を呼び出します。
-
スクリプトを実行するためにPerlRun()関数を呼び出します。
-
perlインスタンスを片付けるためにPerlDestroy()関数を呼び出します。
Perl*関数のためのプロトタイプはPerllib.hというファイルにあります。
あなたのプロジェクトのビルドのために
-
Perl for Win32のソース配布をダウンロードして、それをビルドします。
-
perl100.libがあなたの使っているライブラリパスに置かれていることを
確認します。このライブラリをあなたのビルド設定のリンクタブにある
ライブラリファイルに追加します。
-
perlのインクルードファイルがあなたのインクルードパスに置かれている
ことを確認します。
Gordon WeakliemはPerl for Win32インタープリターの埋め込みに関する
ことを彼のwebページに置いています。アドレスは以下の通りです。
http://www.metronet.com/~gweakl/perl.html
10.3. 標準の配布セットからエンベッドしたperlを入れたプログラムがあります。
Perl for Win32とではコンパイルされないのはどうしてですか?
Perl for Win32のために、ActiveWareはソースコードを徹底的に変更
しました。このために、以前embed perlのために使われていたAPIは
使えなくなっています。
perlを埋め込む(embed)ための方法については
質問 10.2
を参照してください。
ご意見、ご要望は、
電子メールまたは
投稿にお願い致します。
ホームページへ戻る。