DLLを作成しています。そこでFormをCreateして、リリースをするとメモリー違反でシステムエラーがでます。
一応リリースしなければ、そのエラーはでないのですが、自分でCreateしたものはリリースしなければならないのか、それともDLL化したprojectが閉じられたときに、Formはメモリーを開放するのか、どなたかご存知の方教えてください。
ちなみにFormのほかに、フレームとデータモジュールを使ってます。
どう呼んでいるのでしょうか。
DLLを解放するときに、メモリを確保したままでは解放できませんので、メモリリークします。
例えば、
LoadLibrary
(DLL内関数)ShowForm・・・DLL内で定義したFormを表示する関数
(DLL内関数)ShowForm・・・DLL内で定義したFormを隠す関数
FreeLibrary
と呼ぶときに、
LoadLibrary・・・この時点でFormをCreate
(DLL内関数)ShowForm
(DLL内関数)ShowForm
FreeLibrary・・・この時点でFormをDestroy
としていればFreeLibraryは失敗しません。
Formの作り方によっては、リークする可能性もありますが、それはEXEでも同じです。
unit SndNyuMod;
interface
uses
SyokujiSentakuU, FrameKrankeU, FrameShokujiU, UDrkensa,
Ukangodo, Unyuuin, Usiji, Usyokuji, Usyusyok, UKangoCommon, Comn_SYS;
var
//DLL内の全てのフォームの記述
frmdrkensa : Tfrmdrkensa;
frmkangodo : Tfrmkangodo;
frmnyuuin : Tfrmnyuuin;
KangoCommon : TKangoCommon;
procedure SndNyuDat(KrankeCD : PChar; NurseCD : PChar); export;
implementation
procedure SndNyuDat(KrankeCD : PChar; NurseCD : PChar);
var
strSQL : string;
begin
//フォームのインスタンスを作成
frmnyuuin := Tfrmnyuuin.Create(nil);
frmdrkensa := Tfrmdrkensa.Create(frmnyuuin);
frmkangodo := Tfrmkangodo.Create(frmnyuuin);
KangoCommon := TKangoCommon.Create(nil);
//入院側のフォームにコードを渡す
Unyuuin.strNyuKraCD := KrankeCD;
Unyuuin.strNyuLoginID := NurseCD;
Unyuuin.strNyuLoginNM := frmnyuuin.QueryTest.FieldByName('username').AsString;
//入院フォームを開く
frmnyuuin.ShowModal;
//インスタンスの破棄
KangoCommon.Free;
frmkangodo.Release;
frmdrkensa.Release;
frmnyuuin.Release;
end;
end.
先ほど掲示板に載せたのが、DLL内でFormをクリエイトとリリースをしているところです。なにかご指摘があれば、よろしくおねがいします。
これだけでは、なんともいえません。
1点、気になったのは、FreeとReleaseが混ざっていること。
Formの破棄はReleaseを使ったほうがよいと、ヘルプには書いてあります。
実際は、CM_RELEASEをPostMessageして、メッセージ処理でFreeを呼び出しているだけのようですが。
例えば、frmnyuuin内でデータベースを開きっぱなし、ということはありませんか?
>例えば、frmnyuuin内でデータベースを開きっぱなし、ということはありません
>か?
frmnyuuin内でデータベースを開きっぱなしの可能性があります。これが原因かどうか調べてみます。
こんな基本的なことですみません。
いつもご回答していただき、ありがとうございます。
ちょっと気になったのですが、
frmdrkensa := Tfrmdrkensa.Create(frmnyuuin);
frmkangodo := Tfrmkangodo.Create(frmnyuuin);
この2つのクラスはForm(TComponent派生クラス)ですよね?
もしそうだとすれば、frmnyuuinが破棄されるときに、この2つのインスタンスも解放されると思います。
2つのReleaseを取り除いてみてください。
あと、DLLのデバッグはなにかと面倒いので、同じDelphiで開発していらっしゃれば、DLLではなく、ユニットを追加したほうがデバッグが楽だと思います。
ぐはぁ…よく見てみたら、最後にfrmnyuuin解放されてましたね(^^;
申し訳ないです。気にしないでくださいませ。
ツイート | ![]() |