013 Windows进程及线程
Windows 进程及线程
● 进程的组成
○ 进程是“惰性”的,进程要做的任何事情,都必须让线程来运行,线程执行进程地址空间中包含的代码
◌ 进程本身无法运行任何东西
◌ 进程划定一个区域,存在一些代码,这些代码都是静态存在的
○ 一个进程可以拥有多个线程,所有的线程都能够在进程的地址弓箭中“同时”运行代码,每个线程都有他自己的一组CPU寄存器以及自己的堆栈。
◌ 一个进程最少可以有一个线程
◌ 如果一个进程里面没有线程会被销毁
○ 每个进程必须有一个线程,当系统创建一个进程时,会自动创建一个线程。这个线程我们称为主线程。如果没有线程要执行进程地址空间中的代码,进程就失去了存在的意义,此时系统会自动销毁进程以及它的地址空间
◌ 线程执行CPU的代码
◌ Windows是一个支持多进程技术的操作系统
○ 操作系统会以轮询的方式为每一个线程分配CPU时间片,从营造出“并行”的假象。
○ 如果计算机拥有多个CPU,操作系统会更复杂的方式为线程分配CPU时间。
● 内核对象
○ 操作系统用来管理进程
● 地址空间
○ 包含了可执行文件及DLL模块的代码和数据
应用程序类型
● 控制台用户界面
○ 控制台程序则是基于文本的它们一般不会创建窗口或进程消息,而且不需要GUI
◌ 通过文本交互的程序都叫做CUI
◌ 基于文本操作的叫做CUI
◌ 并不是说CMD执行的程序就叫做CUI
//我们现在学习的win32api 都是跟C 函数模式的 //跟C++关系不大,因为C++是类封装
● 图形用户界面
○ GUI程序一个图形化的前端,它可以创建窗口,可以拥有菜单,能通过对话框与用户交互,还能使用所有标砖 “视窗化” 的东西 Windows 的几乎所有附件应用程序都是GUI程序
● 区别
○ 1.在 VS中,CUI程序的链接器开关位 /SUBSYSTEM:CONSOLE,GUI程序的链接器开关位 /SUBSYSTEM:WINDOWS.在加载时,会获取此值,如果是一个文本控制台窗口,操作系统会使用命令提示符启动这个程序,否则它只是加载这个,由应用程序来管理自己的窗口
○ 2.入口函数不同
int WINAPI _tWinMain( HINSTANCE hInstanceExe, HINSTANCE hPreInstancec, PTSTR pszCmdLine, int nCmdShow);
1 int _tmain( 2 int argc, 3 TCHAR *argv[], 4 TCHAR *envp[] 5 );
○ 启动函数不同,GUI的启动函数位 WinMainCRTStartup或wWinMainCRtatup,CUI的启动函数为mainCRTStartup或wmainCStartup
◌ 命令提示符是一个软件,完全独立软件
◌ 我们开发的程序是另外一个软件,如果里面设置了命令行,或者控制台,用户界面属性
1 #include <Window.h> 2 #include <tchar.h> 3 //Main CUI -> 4 //WinMin GUI ->新建或附加一个控制台程序 5 6 //程序 7 //无法解析外部符号 _main,该符号在函数 "int __cdecl invoke main(void)" (?invoke_main@@YAHXZ)中被引用 8 //找Main函数 9 //无法解析的外部符号 _WinMain@16,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用 10 //找WinMain函数 11 //CUI 12 int main() 13 { 14 return 0; 15 } 16 //GUI程序的链接器开关位 17 int WINAPI _tWinMain( 18 _In_ HINSTANCE hInstance, //进程句柄 19 _In_ HINSTANCE hPrevInstance, //前一个进程的句柄 尽量不要使用 或者不使用 20 _In LPTSTR lpCmdLine, //命令行 21 _In_ int nCmdShow) //显示的方式 SW_SHOW SW_HIDE 22 { 23 return 0 24 }
1 #include <tchar.h> 2 #include <windows.h> 3 4 #include <stdio.h> 5 6 int main( ) 7 { 8 HINSTANCE hInstance = GetModuleHandle(NULL); //获取窗口句柄 9 //程序基质0x400000 10 printf("0x%x\r\n",hInstance ); 11 12 TCHAR* const strCommline = GetCommandLine(); 13 //LPTSTR WINAPI GetCommandLine(void); 14 _tprintf(TEXT("%s\r\n"),strCommline); 15 int nNumArgv; 16 LPWSTR* ppArgv = CommandLineToArgvW( strCommline, &nNumArgv); 17 if( ppArgv != NULL) 18 { 19 for(int nIndex = 0; nIndex < nNumArgv; ++nIndex ) 20 { 21 _tprintf( TEXT("%s\r\n"), ppArgv[nIndex] ); 22 } 23 } 24 25 26 system("pause"); 27 return 0; 28 }
1 //环境变量 2 LPTCH strPath = GetEnvironmentString(); 3 _tprintf(TEXT("%s \r\n"), strPath); 4 //FreeEnvironmentStrings();
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 赶AI大潮:在VSCode中使用DeepSeek及近百种模型的极简方法
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地