Form付DLLを使っているんですが、気がついたら、DLLフォーム終了後アドレス読み込みエラーが出るようになっていました。
メインフォーム起動時にすべてのフォームとデータモジュールをCreateし、
メインフォームのCloseイベントで、全部Freeしています。
Closeイベントをステップ実行で追ってみたんですが、
procedure TMain.FormClose();
begin
DataModule.Free;
SubForm1.Free;
SubForm2.Free;
MainForm.Free;
Application.Handle := 0;
end;
で最後まで通ってエラーが出ます。
MainFormとDatamoduleだけのときは出てなかったので、やっぱりSubFormを使わない仕様に戻していき、確認するしかないのでしょうか?
Form付DLLを20くらい作ってるんですが、そのいくつかに起動・終了を繰り返すとアドレス読み込みエラーが出ると分かりました。
4回目で出るのもあれば、2回目で出るのもあります。
おなじDLLでもXPだと2回目、Win7だと1回目の終了時から出たりします。
これは、プロジェクトのファイルが壊れてるのか、Delhiの方が壊れているのか、検討もつきません。
While文で無限ループに入って強制終了したり開発が荒っぽくなるので、どうしてもそっちも心配になります。
環境はwinXP + Delphi7entです。
>プロジェクトのファイルが壊れてるのか、Delhiの方が壊れているのか、
アドレスに対する読み込み違反 なら、それらの可能性は低い気がします。(断言はできませんけど・・)
>Form付DLLを20くらい作ってるんですが、そのいくつかに起動・終了を繰り返すとアドレス読み込みエラーが出ると分かりました。
シンプルな Form付DLL をテスト用にいくつか作成して、それを
起動・終了を繰り返してもエラーが表示しますか?
そのコードでエラーが表示するなら、そのテスト用のコードをここに挙げてみるのはいかがですか?
ちょっと気分転換してるうちに気づいたのですが、
StringGridのOnDrawCellで、入力されたキーコードでDataModuleのクエリーから表示用の名称を引っ張ってくる仕様にしていました。
それが自動の処理だから、先にDataModuleを解放するとアドレスエラーになるのではと思い、
DataModule.Free;
MainForm.Free;
Application.Handle := 0;
から
MainForm.Free;
DataModule.Free;
Application.Handle := 0;
に代えてみました。
案の定、アドレスエラーが格段に減りました。
といっても、2回めエラーから5回目エラーになった程度ですが、
フォームが抱えている自動処理をしらみつぶししてみようと思います。
ちなみにエラーの出るリアルソースです。
//////////////////////////////////////////////////////////////////
//DLL呼び出し
function AcceptOrderCreate(hWnd: THandle; User,Password:PChar):WordBool; stdcall;
begin
Result := False;
//引数処理
Application.Handle := hWnd;
UserCode := User;
SQLPassword:=Password;
//サイドフォーム管理
dmDatabase := TdmDatabase.Create(Application);
frmSectionSelect := TfrmSectionSelect.Create(Application);
frmDayMissFollow := TfrmDayMissFollow.Create(Application);
frmOrderCheck := TfrmOrderCheck.Create(Application);
//自分
frmMain := TfrmMain.Create(Application);
frmMain.Show;
end;
exports AcceptOrderCreate;
/////////////////////////////////////////////////////////////////////
//終了処理
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//更新があったら
if QualifeCheck then
begin
if MessageDlg('情報が更新されています。保存してもいいですか?',mtConfirmation ,[mbYes, mbNo], 0) = mrYes then
actDBAddExecute(Sender);
end;
WriteIni;
//解放
frmMain.Free;
frmSectionSelect.Free;
frmDayMissFollow.Free;
frmOrderCheck.Free;
dmDataBase.Free;
Application.Handle := 0;
end;
グリッドを使わないカード型の入力フォームはエラーでないんです。
フォームの解放は、Freeメソッドではなく、Release メソッドを使用しても同じですか?
治りました!
何回起動してもアドレスエラーが出ません。
データモジュールはFreeのままで、フォームはReleaseにしました。
igyさん、ありがとうございました。
ツイート | ![]() |