[ top ] [ prev ] [ up ] [ next ] Last-Modified: 2005/09/07

QForms in the DLL

*.exe と *.dll (*.so) の双方で uses QForms すると core を吐く。

VCL Apollo では,Apollo.exe と Phi.dll の双方で uses Forms しており,これで問題なく動作している。しかし CLX では Qt ライブラリ初期化の問題があり,*.exe と *.dll (*.so) の双方で uses QForms すると core を吐くことが知られている。

borland.public.delphi.clx.components.using で見つけた記事
> I created a .dll that uses QForms. I'm loading and unloading it and when
> unloading I get an Access Violation at QtIntf.dll. Anyone can help?

CLX is not designed to be used in a .dll / .so and you should use 
packages instead.
QForms を使わないコンソールアプリケーションと QForms 入り DLL の組み合わせは問題ない。

さて,逃げ道としては,実行時パッケージを使う手がある。
ruby --> dll --+
               |
              bpl
               |
      Apollo --+
ap-list:1960 で中口さんに教えてもらったところによれば,こんな構成にしてやればよいらしい。clx オブジェクトは常に bpl の中にあるわけだ。
手順
  1. phi.so と同じ内容の phibpl.bpl を作成する。
  2. phibpl.bpl を使い,メソッド Init_phidll (-> PhiMainUnit.Init_phi ) を持った phidll.dll を作成する。
  3. ruby_ap からは rtl, visualclx, phibpl を実行時パッケージとして使う。
  4. apollo からも同じ。Pythia ではなく PhiMainUnit (in phibpl ) を使う。
  5. foo.rb では require 'phidll' とする。
が,これが現状の Kylix ではうまくいかない..。その理由を次に示そう。

*.pas で exports 節を記述すると内部エラーが起こり得る。

Delphi6 では問題なくても Kylix で内部エラーになることがある。
CLX Apollo をデバッグする過程で,再現可能な小さなソースを作ることに成功したので置いておく。
L1713.tgz
これは『内部エラーL1713』を引き起こす。
$ dcc b.dpk
...
Internal error: L1713
*.pas の exports 節がまずいらしい。

exports エントリの存在する実行時ライブラリを使うと内部エラーが起こる。

再現可能な小さなソースを作ることに成功したので置いておく。 (2002/03/20)
LA76.tgz
これは『内部エラーLA76』を引き起こす。
$ dcc phi
Fatal: Internal error: LA76

ゆえに

ゆえに,挫折したわけである。^^;
暫定の解決策として CLX Apollo では *.exe と *.dll (*.so) を分断して個別に動作させることにした。
これが可能なのは,ruby は require 時に共有ライブラリを動的にリンクするためだ。
ruby --> dll - main_unit (QForms)
  |
  |
  |
  +-- Apollo - main_unit (QForms)
main_unit はソースレベルでは同一だが,実行時には共有されない。
BPL と DLL の動作を検証するための,簡単なソースを置いておく。
bpldll.tgz
author: YOSHIDA Kazuhiro
[ top ] [ prev ] [ up ] [ next ]