procedure TForm1.Button1Click(Sender: TObject);
var
DLLExecute : function : Integer; stdcall;
ModuleHandle : HModule;
TPExecute : TFarProc;
S : string;
LInt : Integer;
begin
ModuleHandle := LoadLibrary('DUMMY.DLL');
if ModuleHandle <> 0 then
begin
TPExecute := GetProcAddress(ModuleHandle, 'Execute');
if (TPExecute <> nil) then
begin
@DLLExecute := TPExecute;
try
LInt := DLLExecute;
except
on E: Exception do
begin
S := E.Message;
end;
end;
end;
Memo1.Lines.Add(S);
// 以下のコードが実行されないので,メモリリークが発生する
FreeLibrary(ModuleHandle);
Memo1.Lines.Add(S);
end;
end;
デバッガ例外通知で [継続] をクリックすると何回かデバッガ例外通知となります.
最後に下図のように表示されます.
動作確認は Windows 7 U64(SP1) + Delphi XE5(UP2) Pro VCL-32 です.
procedure TForm1.Button1Click(Sender: TObject);
var
DLLExecute : function : Integer; stdcall;
ModuleHandle : HModule;
TPExecute : TFarProc;
S : string;
LInt : Integer;
begin
ModuleHandle := LoadLibrary('DUMMY.DLL');
if ModuleHandle <> 0 then
begin
TPExecute := GetProcAddress(ModuleHandle, 'Execute');
if (TPExecute <> nil) then
begin
@DLLExecute := TPExecute;
try
LInt := DLLExecute;
except
on E: Exception do
begin
S := E.Message;
UniqueString(S);
end;
end;
end;
Memo1.Lines.Add(S);
// 以下が実行されるのでメモリリークは発生しない
FreeLibrary(ModuleHandle);
Memo1.Lines.Add(S);
end;
end;
デバッガ例外通知で [継続] をクリックすると下図のように表示されます.
例外通知は 1 回だけです.
EXE の直接起動では例外通知は表示されません.
動作確認は Windows 7 U64(SP1) + DelphiXE5(UP2) Pro VCL-32 です.