DLLでのFormのリリースをするには?

解決


鷹羽 あずさ  2002-05-23 13:25:00  No: 905  IP: [192.*.*.*]

DLLを作成しています。そこでFormをCreateして、リリースをするとメモリー違反でシステムエラーがでます。
一応リリースしなければ、そのエラーはでないのですが、自分でCreateしたものはリリースしなければならないのか、それともDLL化したprojectが閉じられたときに、Formはメモリーを開放するのか、どなたかご存知の方教えてください。

ちなみにFormのほかに、フレームとデータモジュールを使ってます。

編集 削除
にしの  2002-05-23 14:39:01  No: 906  IP: [192.*.*.*]

どう呼んでいるのでしょうか。
DLLを解放するときに、メモリを確保したままでは解放できませんので、メモリリークします。
例えば、
LoadLibrary
(DLL内関数)ShowForm・・・DLL内で定義したFormを表示する関数
(DLL内関数)ShowForm・・・DLL内で定義したFormを隠す関数
FreeLibrary
と呼ぶときに、
LoadLibrary・・・この時点でFormをCreate
(DLL内関数)ShowForm
(DLL内関数)ShowForm
FreeLibrary・・・この時点でFormをDestroy
としていればFreeLibraryは失敗しません。
Formの作り方によっては、リークする可能性もありますが、それはEXEでも同じです。

編集 削除
鷹羽 あずさ  2002-05-23 14:49:35  No: 907  IP: [192.*.*.*]

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.

編集 削除
鷹羽 あずさ  2002-05-23 14:51:20  No: 908  IP: [192.*.*.*]

先ほど掲示板に載せたのが、DLL内でFormをクリエイトとリリースをしているところです。なにかご指摘があれば、よろしくおねがいします。

編集 削除
にしの  2002-05-23 14:58:47  No: 909  IP: [192.*.*.*]

これだけでは、なんともいえません。
1点、気になったのは、FreeとReleaseが混ざっていること。
Formの破棄はReleaseを使ったほうがよいと、ヘルプには書いてあります。
実際は、CM_RELEASEをPostMessageして、メッセージ処理でFreeを呼び出しているだけのようですが。

例えば、frmnyuuin内でデータベースを開きっぱなし、ということはありませんか?

編集 削除
鷹羽 あずさ  2002-05-23 15:19:40  No: 910  IP: [192.*.*.*]

>例えば、frmnyuuin内でデータベースを開きっぱなし、ということはありません
>か?

frmnyuuin内でデータベースを開きっぱなしの可能性があります。これが原因かどうか調べてみます。
こんな基本的なことですみません。

いつもご回答していただき、ありがとうございます。

編集 削除
wing  2002-05-24 01:03:05  No: 911  IP: [192.*.*.*]

ちょっと気になったのですが、
  frmdrkensa         := Tfrmdrkensa.Create(frmnyuuin);
  frmkangodo         := Tfrmkangodo.Create(frmnyuuin);

この2つのクラスはForm(TComponent派生クラス)ですよね?
もしそうだとすれば、frmnyuuinが破棄されるときに、この2つのインスタンスも解放されると思います。
2つのReleaseを取り除いてみてください。

あと、DLLのデバッグはなにかと面倒いので、同じDelphiで開発していらっしゃれば、DLLではなく、ユニットを追加したほうがデバッグが楽だと思います。

編集 削除
wing  2002-05-24 01:20:59  No: 912  IP: [192.*.*.*]

ぐはぁ…よく見てみたら、最後にfrmnyuuin解放されてましたね(^^;
申し訳ないです。気にしないでくださいませ。

編集 削除