公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

Windows系統編程-強制結束進程

admin
2025年3月27日 21:42 本文熱度 406

進程有啟動就有終止,通過CreateProcess函數可以啟動一個新的子進程,但是如何終結子進程呢?主要有四種方法:

通過主線程的入口函數(main函數、WinMain函數)的return關鍵字終止進程

一個應用程序只有一個入口函數,對于控制臺來說是main函數,對于GUI程序來說這個入口函數一般是WinMain。入口函數通過return關鍵字返回或者程序自上而下執行完成之后,進程可以自動終止,進程相關的所有資源都會被操作清理。這也是開發中最常用的進程終止方法,也是強烈推薦大家使用的終止進程的方式。

那么如何能獲取到子進程的返回值呢,以下面代碼為例,這是一個最簡單的控制臺程序,它返回-3。

#include <iostream>
#include <Windows.h>
int main()
{
return -3;
}

首先演示在cmd控制臺或者bat腳本中如何獲取該進程的最終返回值:通過echo %errorlevel%命令可以獲取到上一個cmd命令的返回值。如下:


在程序中獲取子進程的返回值,CreateProcess函數創建子進程成功之后,主進程可以拿到子進程的句柄。通過調用GetExitCodeProcess函數可以獲取到某個進程的返回值,函數原型如下:

BOOL GetExitCodeProcess(
  HANDLE  hProcess,//子進程句柄
  LPDWORD lpExitCode//用于接受子進程的返回值
)
;

請看以下代碼:

#include <iostream>
#include <Windows.h>
int main()
{
//即將啟動的exe程序路徑
 LPCWSTR lpApplicationName = L"D:\\project\\ConsoleApp1\\x64\\Debug\\NewApp.exe";

// 定義啟動信息和進程信息結構
 STARTUPINFOW si;
 PROCESS_INFORMATION pi;

// 初始化啟動信息結構
ZeroMemory(&si, sizeof(si));
 si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

 BOOL ret = CreateProcess(lpApplicationName,
NULL,
NULL,
NULL,
 FALSE,
 CREATE_NEW_CONSOLE,
NULL,
NULL,
 &si,
 &pi);
// 等待進程結束
WaitForSingleObject(pi.hProcess, INFINITE);

// 獲取子進程的返回值
 DWORD exitCode;
GetExitCodeProcess(pi.hProcess, &exitCode);
// 將無符號整數轉換為有符號整數
int signedExitCode = static_cast<int>(exitCode);
 std::cout << "Child process exited with code: " << signedExitCode << std::endl;
return0;
}

主程序在創建子進程之后,首先調用WaitForSingleObject等待子進程結果,然后調用GetExitCodeProcess函數獲取子進程的返回值。但是這里注意,如果子進程返回0或者正數是沒問題的,因為DWORD是一個無符號的整數類型,但是如果子進程返回負數的話,就需要我們手動將無符號整數轉換為有符號整數。最后執行結果如下,可以看到正常獲取到了子進程的返回值。


通過ExitProcess函數終止進程

ExitProcess函數可以終止進程,并且會設置一個進程的返回值。該函數原型只有一個參數,就是進程的返回值:

void ExitProcess(
  UINT uExitCode //進程返回值
)
;

注意:調用ExitProcess之后,進程會直接退出,ExitProcess之后的函數都不會繼續執行,在程序中,一定要盡量避免直接調用這個函數,我們以下面的代碼為例:

#include <iostream>
#include <Windows.h>
int main(int argc, char** argv)
{
ExitProcess(-4);
 std::cout << "Hello World!" << std::endl;
return -3;
}

當我們雙擊編譯好的控制臺程序之后,會發現hello World!并沒有被執行,并且成功的返回了-4,效果如下:


通過TerminateProcess函數終止進程

我們首先來修改子進程程序,通過一個無限while循環使進程永遠不會退出:

#include <iostream>
#include <Windows.h>
int main(int argc, char** argv)
{
while (true) {
 std::cout << "Hello World!" << std::endl;
Sleep(1000);
 }
}

然后按照上面的代碼,創建完子進程之后,我們可以調用TerminateProcess函數直接終止子進程。

BOOL ret = CreateProcess(lpApplicationName,
NULL,
NULL,
NULL,
 FALSE,
 CREATE_NEW_CONSOLE,
NULL,
NULL,
 &si,
 &pi);

TerminateProcess(pi.hProcess, -3);

TerminateProcess函數非常的簡單粗暴,會強制將子進程終結,也應該盡量避免直接調用該函數終止進程,只有在其他辦法都無法強制終結子進程的情況下,才可以使用該函數強制終結進程。


閱讀原文:原文鏈接


該文章在 2025/3/28 11:31:11 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 成人亚洲国产精品久久 | 国产精品一区二区三久久不卡 | 国产精品制服丝袜无码 | 国产午夜片无码区在线观看 | 国产自国产自愉自愉免 | 精品人妻无码一区二区色欲aⅴ | 99久久这里只有精品 | 国产成人精品88综合久久久久 | 成人黄色在线观看一区 | 国产成人无码aⅴ片在线图 国产成人无码aa | 国产无码精品在线 | 国产激情无码毛片久久 | 99九九成人免费视频精品 | 国产萌白酱喷水视频在线播放 | 国产精品区在线12p 国产精品区在线观看 | 国产无套露脸 | 按摩院的色情按摩 | 91黑丝半腿过膝吊带丝袜 | 国产成人精品视频午夜 | 国产福利在线免费 | 成人欧美一区二区三区在线视频 | 国产精品+日韩精品+在线播放 | 国产高清国内精品福利色噜噜 | 国产精品久在线观不 | 国产日韩成人 | 国产精品日产欧美一区二区三区 | 成人综合国内精品久久久久久影院 | 国产91精品露脸国语对白 | 精品国产乱码一区二区三区网站 | 国产秘精品一区二 | 国产成人免费视频在线网站 | 国产精品伊人 | 91麻豆产精品久久久久久夏晴子 | www.亚洲一区二区三区 | 国产97碰| 精品国产伦一区二区三区在线观看 | 91久久丝袜人妻一区二区 | 成人一区欧美高清夜夜片a 成人一区三区 | 成人精品久久一区二 | 国产一级毛片国语版有字幕 | 国产精品99一区二区三区 |