Windos核心编程学习笔记

2024-06-01 08:18

本文主要是介绍Windos核心编程学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


1、获取错误信息
   1)GetLastError(),FormatMessage();
   2)在VS的Watch窗口中使用$err,hr来查找当前线程的“上一个错误代码”;
2、缓冲区溢出,这个是处理字符串时的典型错误;
3、字符串或者字符前面加上字母L,则通知编译器该字符串或者字符应该编译成为一个Unicode的字符串或者字符,比如L"A String",L'A';
4、errno.h ERANGE范围错误发生,STRUNCATE字符截断;
5、ShellExecute(NULL,"open",NULL,NULL,m_strPath.c_str(),SW_SHOWNORMAL);打开当前的文件夹;
6、在任务条上显示图标是利用系统API函数Shell_NotifyIcon()来将一个图标显示在任务栏的通告区中;
7、GetExitCodeProcess()获取指定进程的状态,或者其退出的信息;
8、GetCurrentProcessId(),GetProcessId(),GetThreadId();获得进程或者线程的ID;
9、 PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。
10、SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。而且,PostMessage的返回值表示PostMessage函数执行是否正确;而SendMessage的返回值表示其他程序处理消息后的返回值。
11、创建线程后返回了线程句柄,新创建的线程内核对象的使用计数是2,一个是线程本身,一个是创建线程的线程,创建线程的线程closehandle后,新的线程的内核对象使用计数为1,当这个新线程结束运行后内核对象的使用计数还要减1,这时内核对象的使用计数是0,则系统会自动删除新线程的内核对象,这是正常的处理流程。
12、进程或线程对象会在停止运行时被触发;
13、Microsoft选择在已分配的CPU时间到期时,才将作业的状态变成已触发;
14、CreateThread()函数是用于创建线程的Windows函数,beginthreadex是Microsoft C++运行库函数。
15、在用findfirst()和findnext()函数去查找磁盘文件时经常使用的一个数据结构WIN32_FIND_DATA的成员变量里包含了以上所有的文件属性,因此可以通过这个结构作为获取和更改文件属性的手段。
16、HANDLE GetCurrentProcess(),GetCurrentThread(),返回的都是伪句柄,通过CloseHandle只是简单的忽略此调用,并返回FALSE;线程的伪句柄是一个指向当前线程的句柄,如果把父线程的伪句柄传递给子线程,那么在子线程中对此父线程的伪句柄进行操作,实际上是对子线程的操作;故需要通过DuplicateHandle()(增加线程的使用计数)将伪句柄转换成真正的句柄,并且使用完这个函数之后还要先调用CloseHandle来减少线程的使用计数。
17、尽量使用C/C++运行库函数_beginthreadex和_endthreadex来创建线程和销毁线程,因为这类函数内部自己维护了一个线程的内存块。
18、WaiteForDebugEvent()返回的调试事件时,Windwos将冻结被调试进程中的所有线程,直至调试器调用ContinueDebugEvent,目前没有直接挂起进程的函数,可以自己编写。
19、睡眠:Sleep(0),告诉系统,主调线程放弃了时间片的剩余时间,强制系统调用其他线程。Sleep(0)只会调入优先级大于等于主线程的其它线程,而辅助线程的优先级低,那么应该来说根本就轮不到调用它,从2003 server开始,Sleep(0)变成了调度所有可调度线程,跟SwitchToThread差不多了
20、切换到其他线程:Switchtothread当调用这个函数的时候,系统要查看是否存在一个迫切需要CPU时间的线程。如果没有线程迫切需要CPU时间,SwitchToThread就会立即返回FALSE。如果存在一个迫切需要 CPU时间的线程,SwitchToThread就对该线程进行调度(该线程的优先级可能低于调用 SwitchToThread的线程)。
21、关键段(对共享资源进行“原子”访问)的最大好处在于它们非常容易使用,而且它们在内部也使用了Interlocked函数,因此执行速度非常快。最大的缺点在于它们无法用来在多个进程之间对线程进行同步。
22、DestroyWindow()非模态对话框的窗口销毁;
EndDialog(IDCANCEL) ; //模态对话框的窗口销毁。
23、 volatile 关键字只在 Release 模式下才发挥了它的作用,当使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,而不会对其优化。
24、对于关键代码段而言,对于同时使用对个锁的时候,我们必须在代码中的任何地方以完全相同顺序来获得资源的锁。但是在调用LeaveCritoCalSection的时候顺序无关紧要,这是因为该函数从来不会让线程进入等待状态。
25、WaiteForMultiPleObject(,,false,)函数如果等到一个内核对象以后,需要将这个已触发的句柄从数组中移除,否.在每次调用的时候都会直接返回。
26、CreateWaitableTimer(),TRUE手动定时器,需要调用SetWaitableTimer才能将定时器变成信号,如果FALSE,自动定时器,需要调用WaitForSingleObject即可实现定时器信号的重置。WaitforsingleObject即使有回调函数也是不会执行的
27、SetWaitableTimer如果值是正的,代表一个特定的时刻。如果值是负的,代表以100纳秒为单位的相对时间。
28、PtrToUlong;
29、MoveMemory将一段内存移到什么位置。
30、就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类型的一个引用变量,该参数是const类型,不可变的,例如:类X的拷贝构造函数的形式为X(X& x)。
以下情况都会调用拷贝构造函数:
一个对象以值传递的方式传入函数体
一个对象以值传递的方式从函数返回
一个对象需要通过另外一个对象进行初始化。
31、接收I/O请求完成通知的方法:触发设备内核对象,触发事件内核对象,I/O完成端口
32、QueueUserAPC,允许手动地将一项添加到APC队列中,,他可以非常高效的进行线程间通信,甚至能够跨越进程的界限,但是只能传递一个值。
33、当线程被挂起的时候,如果我们等待的那个(或那些)内核对象被触发,或线程的APC队列中出现了一项,那么线程都将被唤醒,所以我们可以通过调用QueueUserAPC函数,手动地向指定线程的APC队列中添加一项,如果线程(或者GetLastError)返回的是WAIT_IO_COMPLETION,那么我们就知道线程得以继续执行的原因是线程至少处理了APC队列中的一项,如果返回的WAIT_OBJECT_0,那证明线程等待的内核对象被触发,处于有信号状态。
34、GetQueuedCompletionStatus的任务基本上就是将调用线程切换到睡眠的状态,直到指定的完成端口的I/O完成队列中出现一项,或者等待的时间已经超出了指定的时间。
35、在C++编译器里不用extern “C”括起C代码,会导致编译器不知道该如何为 C 代码描述内存布局。
36、PostQueuedCompletionStatus(),可以用来唤醒正在等待完成端口但又没有已完成的I/O请求的所有线程,使得线程退出,不用再继续等待。
37、SetFilePointerEx(hFileDst, liFileSizeSrc, NULL, FILE_BEGIN);从文件的开始位置,将文件指针移动liFileSizeSrc个字节
    SetEndOfFile(hFileDst);将当前文件指针所在的位置设置为文件的结尾,从文重新设置了文件的大小。
38、HWND hwnd = GetForegroundWindow();//获取调用者进程当前正在使用的那个窗口的句柄
    HDC hdc = GetDC(hwnd);//转换成窗口所对应的hdc
24.2.3 暂停全局展开 看到这里了
    // Nonbuffered I/O requires sector-sized transfers.
      // I'll use buffer-size transfers since it's easier to calculate.
      liFileSizeDst.QuadPart = chROUNDUP(liFileSizeSrc.QuadPart, BUFFSIZE);

这篇关于Windos核心编程学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020467

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

16.Spring前世今生与Spring编程思想

1.1.课程目标 1、通过对本章内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。 2、 了解Spring的发展历史,启发思维。 3、 对 Spring形成一个整体的认识,为之后的深入学习做铺垫。 4、 通过对本章内容的学习,可以了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。 5、Spring编程思想总结。 1.2.内容定位 Spring使用经验