第二章 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 ...
随机推荐
- H5网页唤醒app,判断app安装
在阅读本文之前你首先应该对js有基本对掌握,并且对Scheme,intent有一定的理解.更多的是代码 上午给朋友做了一个产品引导页,但是需要判断ios系统的TestFlight是否安装,进行了goo ...
- select key from table 一直出错
key和keys 为mysql 关键字,数据库设计字段的时候尽量避免
- linux下nginx搭建
1.准备 1-1.安装 make,zlib,gcc-c++,openssl yum -y install make zlib zlib-devel gcc-c++ libtool openssl o ...
- OpsManager管理MongoDB
mydb1 Ops Manager,mongodb,agent mydb2 mongodb,agent mydb3 mongodb,agent NUMA Settings sysctl -w vm.z ...
- MyBatis学习存档(5)——联表查询
之前的数据库操作都是基于一张表进行操作的,若一次查询涉及到多张表,那该如何进行操作呢? 首先明确联表查询的几个关系,大体可以分为一对一和一对多这两种情况,接下来对这两种情况进行分析: 一.建立表.添加 ...
- 采样方法(二)MCMC相关算法介绍及代码实现
采样方法(二)MCMC相关算法介绍及代码实现 2017-12-30 15:32:14 Dark_Scope 阅读数 10509更多 分类专栏: 机器学习 版权声明:本文为博主原创文章,遵循CC 4 ...
- C语言——指针总结
在创建指针时,我们首先要做的是先初始化它,没有初始化的指针是很危险的,因为指针可以指向一个地址后直接改变它的值,所以为了避免我们的指针在创建后指向一个危险区域(即可能指向系统文件等),我们会先给它一个 ...
- 轻量化模型之MobileNet系列
自 2012 年 AlexNet 以来,卷积神经网络在图像分类.目标检测.语义分割等领域获得广泛应用.随着性能要求越来越高,AlexNet 已经无法满足大家的需求,于是乎各路大牛纷纷提出性能更优越的 ...
- LNMP安装与配置之Nginx
Nginx简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Ramb ...
- idea仿eclipse的export导出功能
自从开发工具从eclipse切换到idea来之后,才知道什么叫做'真香'.idea强大的扩展功能极大的拓展了他的可用性,最近有个功能就是通过idea的扩展插件搞定的. 事情是这样的,朋友使用eclip ...