Perl初心者の部屋  序章  1章  2章  3章  4章  5章  6章  7章  8章  9章
PageID:New Perl-FAQ10J
Last updated:97.07.24

Perl for Win32 Frequently Asked Questions (FAQ)

翻訳者: 木村 浩一さん <kkimura@pure.cpdc.canon.co.jp>

10. エンベッドとエクステンション

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のエクステンションを記述するには 以下のような段階を踏みます。

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*関数のためのプロトタイプはPerllib.hというファイルにあります。

あなたのプロジェクトのビルドのために

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 を参照してください。


ご意見、ご要望は、 電子メールまたは 投稿にお願い致します。

ホームページへ戻る。