[ 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 の中にあるわけだ。
- 手順
-
- phi.so と同じ内容の phibpl.bpl を作成する。
- phibpl.bpl を使い,メソッド Init_phidll (-> PhiMainUnit.Init_phi ) を持った phidll.dll を作成する。
- ruby_ap からは rtl, visualclx, phibpl を実行時パッケージとして使う。
- apollo からも同じ。Pythia ではなく PhiMainUnit (in phibpl ) を使う。
- 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
[ top ] [ prev ] [ up ] [ next ]