第二章 Unicode简介
/*-------------------------------------------------------------
screensize.cpp -- Displays screen size in a message box
(c) Seamanj, 2013/6/26
-------------------------------------------------------------*/ #include <windows.h>
#include <tchar.h>//_vsntprintf在里面定义
#include <stdio.h> int CDECL MessageBoxPrintf( TCHAR* szCaption, TCHAR* szFormat, ... )//知识点1
{
TCHAR szBuffer[];
va_list pArgList;
va_start(pArgList, szFormat);
_vsntprintf(szBuffer, sizeof(szBuffer) / sizeof(TCHAR), szFormat, pArgList);
va_end(pArgList);
return MessageBox(NULL, szBuffer, szCaption, );
}
/*知识点1:函数调用规则
---------------------------------------------
来自<<Windows环境下32位汇编语言程序设计>> P78
--------------------------------------------- 在参数入栈顺序上,C类型和StdCall类型是先把右边的参数先压入堆栈,而PASCAL类型是先把左边的参数压入堆栈.
在堆栈平衡上,C类型是在调用者在使用call指令完成后,自行用add esp,8指令把8个字节的参数空间清除,而PASCAL和
StdCall的调用者则不管这个事情,堆栈平衡的事情是由子程序用ret 8来实现的(ret 指令后面加一个操作数表示在ret
后把堆栈指针esp加上操作数 */ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)//知识点2
{
int cxScreen, cyScreen;
cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN); MessageBoxPrintf(TEXT("ScreenSize"), TEXT("The screen is %i pixels wide by %i pixels high."), cxScreen, cyScreen);//知识点3
return ;
}
/*知识点2:模块与实例
---------------------------------------------
来自<<Windows环境下32位汇编语言程序设计>> P98
--------------------------------------------- 一个模块代表的是一个运行中的exe文件或dll文件,用来代表这个文件中所有的代码和资源,磁盘上的文件不是模块,装入内存后运行时就叫做模块.
一个应用程序调用其他DLL中的API时,这些DLL文件被装入内存,就产生了不同的模块,为了区分地址空间中的不同模块,每个模块都有一个唯一的模块句
柄来标识. 由于很多API函数中都要用程序的模块句柄,以便利用程序中的各种资源,所以在程序的一开始就先取得模块句柄并存放到一个全局变量中可以省去
很多的麻烦,在Win32中,模块句柄在数值上等于程序在内存中装入的起始地址. 取模块句柄使用的API函数是GetModuleHandle,它的使用方法是: invoke GetModuleHandle,lpModuleName lpModuleName参数是一个指向含有模块名称字符串的指针,可以用这个函数取得程序地址空间中各个模块的句柄,例如,如果想得到User32.dll的句柄
以便使用其中包含的图标资源,那么可以如下使用: szUserDll db 'User32.dll',0
...
invoke GetModuleHandle,addr szUserDll
.if eax
mov hUserDllHandle.eax
.endif
... 如果使用参数NULL调用GetModuleHandle,那么得到的是调用者本模块的句柄 invoke GetModuleHandle,NULL
mov hInstance,eax 可以注意到,把返回的句柄放到了取名为hInstance的变量里而并不是放在hModule中,为什么是hInstance呢?Instance是"实例",它的概念来自于
Win16,Win16中不同运行程序的地址空间并非是完全隔离的,一个可执行文件运行后形成"模块",多次加载同一个可执行文件时,这个"模块"是公用的,
为了区分多次加载的"拷贝",就把每个"拷贝"叫做实例,每个实例均用不同的"实例句柄"(hInstance)值来标识它们. 但在Win32中,程序运行时是隔离的,每个实例都使用自己的私有的4GB空间,都认为自己是唯一的,不存在一个模块的多个实例的问题,实际上在
Win32中,实例句柄就是模块句柄,但很多API原型中用到模块句柄的时候使用的名称还是沿用hInstance,所以我们还是把变量名称取为hInstance. 在C语言的编程中,hInstance通过WinMain由系统传入,WinMain的原型是:WinMain(hInstance,hPrevInstance,lpzCmdParam,nCmdShow),程序不用
自己去获得hInstance,这个过程由C的初始化代码代劳了,但在Win32汇编中hInstance必须自己获取,如果不了解hModule就是hInstance的话,就无法
得知如何得到hInstance,因为并没有一个类似GetInstanceHandle之类的API函数.
---------------------------
来自<<WINDOWS程序设计>> P12
--------------------------- WinMain的第一个参数被称作"实例句柄".在Windows编程中,句柄仅是一个应用程序用来识别某些事情的数字.在这种情况下,该句柄唯一地标识该程序,
其他Windows函数需要用该句柄作为参数来调用该程序.在Windows的早期版本中,当同时地同一程序多次时,您便了该程序的"多个实例".同一应用程序的所
有实例共享代码和只读的内存(通常是菜单和对话框模板之类的资源).程序通过检查hPrevInstance参数就能够确定自身的其他实例是否正在运行.然后它
可以超过某种繁杂的工作并从前面的实例将某些数据移到自己的数据区域. 在32位的Windows版本中,该概念已被抛弃.WinMain的第二个参数总是NULL(定义为0). WinMain的第三个参数是用于运行程序的命令行.某些Windows应用程序使用这个参数以在程序启动时将文件加载到内存.WinMain的第四个参数指出程序
最初显示的方式,可以是正常地或者是最大化地充满整个窗口,或者是最小化显示在任务列表栏中. */ /*知识点3:BASIC PRINTF CONVERSIONS
---------------------------------------
来自<<THE C PROGRAMMING LANGUAGE>> P154
---------------------------------------
Character Argument type; Printed As
d,i int; decimal number
*/
第二章 Unicode简介的更多相关文章
- Windows程序设计(第五版)学习:第二章 Unicode简介
第二章 Unicode简介 1,Windows通过双字节技术DBCS解决这个问题,代码页定义不同的字符集,称为ANSI字符集,比如日文为CP932,韩文为CP949,繁体中文为CP950,简体中文为C ...
- ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区 1 Desktop简介 1.1 ArcGIS for Desktop ...
- windows核心编程-第二章 Unicode
第2章U n i c o d e 随着M i c r o s o f t公司的Wi n d o w s操作系统在全世界日益广泛的流行,对于软件开发人员来说,将目标瞄准国际上的各个不同市场,已经成为一个 ...
- 《零成本实现Web自动化测试--基于Selenium》第二章 Selenium简介和基础
第一部分 Selenium简介 1.Selenium 组建 1.1 Selenium-IDE Selenium-IDC是开发Selenium测试案例的集成开发环境.它像FireFox插件一样的工作,支 ...
- 《Node.js 高级编程》简介与第二章笔记
<Node.js 高级编程> 作者简介 Pedro Teixerra 高产,开源项目程序员 Node 社区活跃成员,Node公司的创始人之一. 10岁开始编程,Visual Basic.C ...
- Unity 游戏框架搭建 2019 (九~十二) 第一章小结&第二章简介&第八个示例
第一章小结 为了强化教程的重点,会在合适的时候进行总结与快速复习. 第二章 简介 在第一章我们做了知识库的准备,从而让我们更高效地收集示例. 在第二章,我们就用准备好的导出工具试着收集几个示例,这些示 ...
- 第二章Python入门
第二章 Python入门 2.1.简介 Python是著名的"龟叔"(Guido van Rossum)在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言 Pytho ...
- 第一章 Shiro简介——《跟我学Shiro》(转)
目录贴:跟我学Shiro目录贴 1.1 简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可 ...
- 第二章 NIO入门
传统的同步阻塞式I/O编程 基于NIO的非阻塞编程 基于NIO2.0的异步非阻塞(AIO)编程 为什么要使用NIO编程 为什么选择Netty 第二章 NIO 入门 2.1 传统的BIO编程 2.1.1 ...
随机推荐
- print() 默认是打印完字符串会自动添加一个换行符
可以使用end=" " 参数告诉 print() 用空格代替换行 for i in range(1,10): ... print(i,end=' ') ... 1 2 3 4 5 ...
- Linux:删除一个目录下的所有文件,但保留一个指定文件
面试题:删除一个目录下的所有文件,但保留一个指定文件 解答: 假设这个目录是/xx/,里面有file1,file2,file3..file10 十个文件 [root@oldboy xx]# touc ...
- django API返回中文乱码
renturn HttpResponse(json.dumps(data,ensure_ascii=False))
- 牛客 216D 消消乐 (二分图最小点覆盖)
大意: 给定棋盘, 每次消除一行或一列, 求最小次数使得消除完所有'*'. 裸的二分图最小点覆盖. 二分图的最小点覆盖等于最大匹配, 输出方案时从所有左部未盖点开始标记交替路上的点, 最后左部所有未标 ...
- 怎样设置Cookie
因为 Cookie 是服务器保存在浏览器中的一小段信息, 因此这个设置应当是服务器发起的, 设置方法是在Response Header中添加: Set-Cookie字段, 值是多个键值对. 如下: / ...
- spring——自动装配
语法:<bean id="..." class="..." autowire="byType"/> autowire属性取值如下 ...
- 【原创】大叔经验分享(83)impala执行多个select distinct
impala在一个select中执行多个count distinct时会报错,比如执行 select key, count(distinct column_a), count(distinct col ...
- java八大排序代码
import java.util.ArrayList;import java.util.List; public class FastSort { public static void main(St ...
- 【php设计模式】模板模式
定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤. 通俗点的理解就是 :完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同 ...
- Python打
.智能识别图片物体.这步是智能垃圾分类的魔法核心.原理是人工智能会根据打上标签的海量图片来识别新的图片所归属的分类标签.好奇的读者可能会问,我没学过深度学习啊?我也不会训练模型,怎么办? python ...