第二章 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 ...
随机推荐
- C/C++快读(快速读入)有多——安全AC
在一些算法题目中中,有的程序会被卡常(数),就是说,程序虽然渐进复杂度,(通俗来讲:算法的时间复杂度)可以接受,但因为算法本身的时间常数过大,导致程序在一些算法竞赛中超时.这是,快读就显得尤为重要了. ...
- redis键空间通知(keyspace notification)
一.需求 在redis中,设置好key和生存时间之后,希望key过期被删除时能够及时的发送一个通知告诉我key,以便我做后续的一些操作. 二.环境 系统:windows10 php:7.1 redis ...
- 微信小程序 路由跳转 异步请求 存储数据,微信登录接口
1小程序路由跳转 wx.switchTab(Object object) 这里的tabBar是底下的导航栏指定的页面 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 tabBar l ...
- MongoDB数据库、集合、文档的操作
MongoDB系列第一课:MongDB简介 MongoDB系列第二课:MongDB环境搭建 MongoDB系列第三课:MongDB用户管理 MongoDB系列第四课:MongoDB数据库.集合.文档的 ...
- No database provider has been configured for this DbContext
var context = ((IInfrastructure<IServiceProvider>)set).GetService<DbContext>(); 在EF Core ...
- [NOIP10.4模拟赛]2.y题解--折半搜索+状压计数
题目链接: 咕 闲扯: 这题暴力分似乎挺多,但是一些奇奇怪怪的细节没注意RE了,还是太菜了 分析: 首先我们考虑最naiive的状压DP ,\(f[u][v][state]\)表示u开头,v结尾是否存 ...
- XML模块与类的定义
xml模块 xml介绍: --XML 全称 可扩展标记语言 --<tag></tag> 双标签 标签中间可以加入文本信息 --<tag/>单标签 没有文本 ...
- requests模块高级操作之proxies
一.代理proxy 概念:代理服务器 作用:请求和响应的转发 免费代理 www.goubanjia.com 快代理 西祠代理 代理精灵(付费) 匿名度: 透明:对方服务器知道你使用代理也知道你真实ip ...
- cv2.videocapture()失败,无法读取视频
原因:缺少ffmpeg的支持 解决:一般opencv3.3版本及以上支持ffmpeg,实验4.1.0成功 pip install opencv-python pip install opencv-co ...
- Linux下的头文件搜索路径
对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本configure,它的作用确定编译参数(比如头文件位置.连接库位置等),然后生成Makefile以编译程序.可以进入该软件的目录,执 ...