C++ Builder 參考手冊 ? System::Sysutils ? AddTerminateProc
頭文件:#include <System.SysUtils.hpp>
命名空間:System::Sysutils
函數(shù)原型:
void __fastcall AddTerminateProc(TTerminateProc TermProc);
參數(shù):
TermProc:要添加的在程序退出時詢問是否可以退出的函數(shù),這個參數(shù)是 TTerminateProc 類型的函數(shù)指針箱锐,即沒有參數(shù)缩赛,返回值為 bool 類型的 __fastcall 調(diào)用約定的函數(shù)伦泥,函數(shù)返回 true 表示可以退出卖宠,返回 false 表示不可以退出孕荠。
返回值:
無宦搬。
- 程序正常退出時沈自,先執(zhí)行 AddTerminateProc 添加的函數(shù),如果這些函數(shù)都允許退出笤喳,即全部返回 true为居,再執(zhí)行其他的退出過程,例如 std::atexit 和全局變量的析構(gòu)函數(shù)等杀狡;如果這些函數(shù)當(dāng)中只要有一個函數(shù)返回 false蒙畴,就會取消退出動作;
- 用 std::exit 或 std::abort 結(jié)束進程捣卤,都不會調(diào)用 AddTerminateProc 添加的函數(shù)忍抽。
以下為程序測試結(jié)果:
- 在 Windows 操作系統(tǒng)正常關(guān)機的情況下,即選擇開始菜單里面的 “關(guān)機”董朝,會調(diào)用 AddTerminateProc 添加的函數(shù)鸠项,如果彈出對話框,停在了這些函數(shù)里面子姜,操作系統(tǒng)會提示這個程序阻止了關(guān)機祟绊,是否取消關(guān)機:如果取消關(guān)機楼入,可以看到彈出的對話框,繼續(xù)操作牧抽;如果選擇了繼續(xù)關(guān)機嘉熊,進程被結(jié)束,操作系統(tǒng)關(guān)機扬舒;
- 在 Windows 操作系統(tǒng)正常關(guān)機的情況下阐肤,即選擇開始菜單里面的 “關(guān)機”,會調(diào)用 AddTerminateProc 添加的函數(shù)讲坎,這些函數(shù)直接返回了 false 阻止程序退出孕惜,沒有彈出對話框,操作系統(tǒng)忽略返回值晨炕,直接關(guān)機衫画;
- 在 Windows 任務(wù)管理器里面結(jié)束任務(wù)的時候,雖然調(diào)用了這些函數(shù)瓮栗,但是進程也被結(jié)束了削罩,無論是否彈出對話框,忽略這些函數(shù)的執(zhí)行和返回值费奸。
例子:測試通過關(guān)閉主窗口弥激、Application->Terminate(); 和 std::exit(); 退出程序時是否執(zhí)行了 AddTerminateProc 添加的函數(shù),以及 AddTerminateProc 添加的函數(shù)的執(zhí)行效果货邓。
bool __fastcall TermProc1(void)
{
return Application->MessageBox(L"是否退出秆撮?", L"退出", MB_YESNO|MB_DEFBUTTON2|MB_ICONQUESTION)==IDYES;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Sysutils::AddTerminateProc(TermProc1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
this->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
std::exit(EXIT_SUCCESS);
}
運行結(jié)果:
- 通過窗口右上角的 “×” 關(guān)閉主窗口;
- 點擊按鈕 Button1 通過 this->Close(); 關(guān)閉主窗口换况;
- 點擊按鈕 Button2 通過 Application->Terminate(); 結(jié)束應(yīng)用程序;
都執(zhí)行了 AddTerminateProc 添加的函數(shù) TermProc1盗蟆。
- 點擊按鈕 Button2 通過 std::exit(); 結(jié)束進程戈二;
沒有執(zhí)行 AddTerminateProc 添加的函數(shù) TermProc1。
- 點擊 TermProc1 函數(shù)彈出的對話框的 “否” 按鈕喳资,函數(shù)返回 false觉吭,程序不退出;
- 點擊 TermProc1 函數(shù)彈出的對話框的 “是” 按鈕仆邓,函數(shù)返回 true鲜滩,程序退出。
運行結(jié)果
相關(guān):
- System::Sysutils::TTerminateProc
- System::Sysutils::AddExitProc
- System::Sysutils::TProcedure
- System::Sysutils
- Vcl::Forms::TForm::OnCloseQuery
- Vcl::Forms::TForm::OnClose
- std::atexit
- std::atexit_t
- std::exit
- std::abort
- <cstdlib>
C++ Builder 參考手冊 ? System::Sysutils ? AddTerminateProc