|
<Windows核心编程>
第3章
1)从注册表中读取RegOpenKeyEx
KEY_QUERY_VALUE //查询
KEY_ALL_ACCESS // 不安全
2)创建内核对象的所有函数几乎都有一个参数,用于设定安全属性
3)WaitForInpuIdle
让父进程等待子进程完成初始化
第八章
8.1 原子访问:互锁 P173
InterLockedExchangedAdd(PLONG plAddend, LONG lIncrement);
//以原子操作方式来递增
8.2 高速缓存行 P177
始终都让单个线程来访问数据(函数参数和局部变量是确保做到这一点的最好方法).
线程亲缘性
8.3 高级线程同步 P179
不应该在单处理器计算机上使用循环锁,甚至在多处理器计算机上,也小心使用他们.
Volatile BOOL g_fFinishedCalculation;
8.4 关键代码段 P180
CRITICAL_SECTION g_cs;
EnterCriticalSection (&g_cs);
LeaveCriticalSection (&g_cs);
8.5 关键代码段准确的描述 P182
InitializeCritialSection (PCRITICAL_SECTION pcs);
EnterCritialSection(PCRITICAL_SECTION pcs);
VOID DeleteCriticalSection(PCRITICAL_SECTION pcs);
//删除对该结构中的成员变量
1) 堆栈 P452
将ANSI字符串转换成Unicode字符串时,
ANSI函数必须分配一个内存块,以便放置Unicode版本的字符串。
2) 为什么要创建辅助堆栈? P452
1.保护组件
2.更加有效地进行内存管理
3.进行本地访问
4.减少线程同步的开销
5.迅速释放
3)如何创建辅助堆栈? P454
HeapCreate()
4)从堆栈中分配内存块 P455
HeapAlloc
VirtualAlloc
5)内存映射 P397
CreateFileMapping和MapViewOfFile
6)缓存 P409
7)虚拟内存的状态 P333
GlobalMemoryStatus()
GlobalMemoryStatusEx(); // 内存大于4G
8)确定地址空间的状态 P336
VirtualQuery
VirtualQueryEx // 查询另一个进程的内存信息
9)两个应用程序之间共享数据? P300
采用预编译指令#pragma data_seg在DLL文件中创建一个新的段,并且在DEF文件中把该段的属性设置为“shared”
#pragma pack
10)虚拟地址空间? P300
11)获得3GB用户方式分区
BOOT.ini
12)数据对其的重要性 P319
2) 第23章
1) 内联函数 P575
2) 产生内联(inline)代码,而不是生成调用函数的代码
第25章
1) 虚拟内存技术
2) 结构化异常
3) 异常代码在winError.h文件中定义
4) 异常写到日志或弹出一消息框
5) 与内存有关的异常
EXCEPTION_ACCESS_VIOLATION 线程试图对一个虚地址进行读和写,但没有做适当的存取。
附录B
B.1 消息分流器 P686
// 扩展代码的可读性
B.2 Pragma消息帮助宏 P676
#Pragma chMSG(Fix this later)
实用技巧
1) @err,hr
放在watch窗口,将显示线程的最后错误代码的号码和该错误的英文描述.
2) Error Loopup
Visual Studio 小实用程序将错误代号转换成相应的文本描述.
效率
1) 字符串的转换,需要占用大量内存,统一使用Unicode字符串
COM仅支持Unicode |
|