15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」
[Q]
DLLでデータベースをアクセスする場合、プログラム終了時に
Access Violation等のエラーになりますが、なぜでしょう?
[A]
まず、この現象の発生する条件は下記の様になります。
1.DLLの中でTableやQuery等のコンポーネントを動的にCreateしている。
(データモジュールを使う、使わないは関係ない)
2.DLLを呼び出すプログラム側ではデータベース関係のコンポーネントが
一切使われていない。
又は、コンポーネントは使っているが、Delphi立ち上げ後、1度もActive=True
にしていない。
3.データベースエクスプローラー等をDelphi立ち上げ後、1度も起動し
ていない。
このような時にDLLを呼ぶプログラムを実行し、終了するとエラーになります。
回避策
まず、この現象はDelphiのIDEのもとで実行している時だけ発生します。
つまり、EXEを単体で実行している時は発生しません。
IDEでデバッグ中にもこのエラーが出ないようにするには、データベース
エクスプローラーを最低1回起動し、DLLが読み込んでいるデータベース
のテーブル一覧を最低1回表示します。
これだけで回避出来ます。
なお、これ以外にもDLLとメインプログラム側がString型のデータをやり
とりする場合は、DLL側のプロジェクトソースのUsesの先頭にShareMem、
メインプログラム側のプロジェクトソースのUsesの先頭にもShareMem、
さらに実行環境のWindowsシステムフォルダに、DelphiMM.DLLが無いと
エラーになります。
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。
Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会
|