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();

转载于:https://www.cnblogs.com/sdk123/p/6939467.html

013 Windows进程及线程相关推荐

  1. Windows进程与线程学习笔记(九)—— 线程优先级/进程挂靠/跨进程读写

    Windows进程与线程学习笔记(九)-- 线程优先级/进程挂靠/跨进程读写 要点回顾 线程优先级 调度链表 分析 KiFindReadyThread 分析 KiSwapThread 总结 进程挂靠 ...

  2. Windows进程与线程学习笔记(八)—— 线程切换与TSS/FS

    Windows进程与线程学习笔记(八)-- 线程切换与TSS/FS 要点回顾 线程切换与TSS 内核堆栈 调用API进0环 实验:分析SwapContext 线程切换与FS 段描述符结构 分析Swap ...

  3. Windows进程与线程学习笔记(七)—— 时间片管理

    Windows进程与线程学习笔记(七)-- 时间片管理 要点回顾 基本概念 CPU时间片 分析 KeUpdateRunTime 分析 KiDispatchInterrupt 备用线程 总结 要点回顾 ...

  4. Windows进程与线程学习笔记(六)—— 线程切换

    Windows进程与线程学习笔记(六)-- 线程切换 主动切换 分析KiSwapContext 分析SwapContext 分析KiSWapThread 总结 时钟中断切换 系统时钟 分析INT 0x ...

  5. Windows进程与线程学习笔记(五)—— 模拟线程切换

    Windows进程与线程学习笔记(五)-- 模拟线程切换 ThreadSwitch代码分析 ThreadSwitch.cpp ThreadCore.h ThreadCore.cpp 总结 Thread ...

  6. Windows进程与线程学习笔记(四)—— 等待链表调度链表

    Windows进程与线程学习笔记(四)-- 等待链表&调度链表 要点回顾 33个链表 等待链表 实验:分析等待链表中的线程所属的进程 第一步:查看所属线程结构体: 第二步:查看所属进程结构体 ...

  7. Windows进程与线程学习笔记(三)—— KPCR

    Windows进程与线程学习笔记(三)-- KPCR KPCR +0x000 NtTib : _NT_TIB +0x120 PrcbData : _KPRCB KPCR 描述:CPU控制区(Proce ...

  8. Windows进程与线程学习笔记(二)—— 线程结构体

    Windows进程与线程学习笔记(二)-- 线程结构体 线程结构体 ETHREAD +0x000 Tcb : _KTHREAD 练习 线程结构体 ETHREAD 描述: 每个windows线程在0环都 ...

  9. Windows进程与线程学习笔记(一)—— 进程结构体

    Windows进程与线程学习笔记(一)-- 进程结构体 进程结构体 EPROCESS +0x000 Pcb : _KPROCESS +0x1b0 Peb : Ptr32 _PEB 练习 解题步骤 第一 ...

最新文章

  1. 构建一个计算机网络,计算机网络--网络构建(一)
  2. Spring MVC 如何加载静态html
  3. C++ 模板偏特化-来自STL的思考
  4. python3.6 mysql 教程_Python3.6与MySQL建立连接
  5. oracle_监听器无法启动的问题
  6. 十多位全球技术专家,为你献上近十个小时的.Net微服务介绍
  7. oracle xe gentoo,Oracle在gentoo下安装
  8. python的matplotlib风格_matplotlib 的几种风格 练习
  9. 4线电子围栏安装示意图_电子围栏报警系统安装施工过程(图解)
  10. java之代理设计模式
  11. 网页错误排查 如何?
  12. 计算机网络技术与应用应用题,计算机网络技术与应用题库答案.pdf
  13. 零基础实战Keras模型转化为RKNN格式模型成功运行在RK3399Pro板子上
  14. 编写可执行程序,其它程序调用,并返回数据,C#
  15. bat之长ping保存在文本
  16. godot正确设置2d像素游戏
  17. EXCEL2007导入SQL生成新表并插入数据
  18. JAVA instrument简单使用
  19. 深度学习笔记:DCN
  20. 【工具-代码】OSS阿里云存储服务-代码实现

热门文章

  1. PHP微信动态二维码活码管理系统源码免授权 独立版 带充值支付
  2. 微信二维码 活码转跳
  3. zigbee判断首次入网
  4. 【HTML基础】第一课、Web前端的概述
  5. Correcting Chinese Spelling Errors with Phonetic Pre-training
  6. 保姆式教学--教室友从买服务器到怎么搭建内网隧道
  7. EMC测试仪器_EMC测试整改流程及常见问题
  8. 用了 VS Code、IDEA 等十几款编辑器后,我总结出优秀编辑器的特质
  9. php打印出来乱码_PHP输出中文乱码怎么解决?
  10. java录入个人信息程序_Java:用键盘输入个人信息并输出