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

解決


鷹羽 あずさ  2002-05-23 22:25:00  No: 905

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

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


にしの  2002-05-23 23:39:01  No: 906

どう呼んでいるのでしょうか。
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 23:49:35  No: 907

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 23:51:20  No: 908

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


にしの  2002-05-23 23:58:47  No: 909

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

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


鷹羽 あずさ  2002-05-24 00:19:40  No: 910

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

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

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


wing  2002-05-24 10:03:05  No: 911

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

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

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


wing  2002-05-24 10:20:59  No: 912

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


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加