《windows核心编程》(三)-----------2013.7.27
一、概念
资源的使用
CL.EXE |
.c/.cpp-------------->.obj | LINK.EXE
|------------------>.exe
RC.EXE |
.rc-------------------->.res |
更改程序图标
找到一个.ico的图标文件,然后新建一个文本文件,重命名为HelloWnd.rc,打开编辑,键入代码:
•编写资源的文件 -.rc资源脚本文件
•编译rc文件 - RC.EXE
•将资源链接到程序中 - LINK.EXE
CL.EXE |
.c/.cpp-------------->.obj | LINK.EXE
|------------------>.exe
RC.EXE |
.rc-------------------->.res |
更改程序图标
找到一个.ico的图标文件,然后新建一个文本文件,重命名为HelloWnd.rc,打开编辑,键入代码:
100 ICON small.ico
保存之后打开命令行,进入的文件夹,用RC.EXE将资源文件进行编译,再与目标文件进行链接生成可执行文件。
由于一个项目中有多个文件,用命令行编译起来比较麻烦,所以使用Makefile来进行自动化编译。
Makefile
NMAKE和Makefile
•NMAKE
Makefile的一个解释执行的工具,根据Makefile文件的定义,编译和链接程序,最终生成文件。
•Makefile(以.mak为后缀)
定义编译和链接等操作的脚本文件(把项目的处理命令写入),一般对整个项目进行处理。
Makefile的语法
新建一个文本文件,重命名为HelloWorld.mak,然后键入如下代码。
HELLO:CLEAN //依赖行:依赖项
cl.exe Hellownd.c /c //命令行
rc.exe Hellownd.rc // 命令行
link.exe HelloWnd.obj HelloWnd.res user32.lib //命令行
CLEAN:
del *.obj
del *.res
del *.exe
打开命令行,进入文件,输入:
nmake HelloWnd.mak
运行结果:
Makefile文件中可以有多个依赖行。(有多个依赖行的时候默认情况下只执行第一个依赖行下的命令,其他依赖行命令不执行)
nmake /f HelloWnd.mak CLEAN
(选择HelloWnd.mak中的CLEAN依赖行,然后执行依赖行中的命令)
执行方式
NMAKE首先找到第一个依赖行
检查依赖行的依赖项,如果发现依赖项,首先执行依赖项命令行
执行完所有依赖项命令后,再执行自己的命令行。
A:B
...
B:C
...
C:D
...
D:
...
执行顺序:D-->C-->B-->A
Windows字符和编码
ASC - 7位代表一个字符 128个字符
ASCII - 8位代表一个字符 256个字符
代码页
DBCS - 单双字节混合编码(当前计算机主流编码方式)
UNICODE - 所有字符都按两个字节编码(WIN7与VS2012使用UNICODE编码方式)
在Windows平台下,采用2字节表示一个字符
宽字节与窄字节分别有两套适用于自己的函数。
•字符的编码方式
ASCII - 8位代表一个字符 256个字符
代码页
DBCS - 单双字节混合编码(当前计算机主流编码方式)
UNICODE - 所有字符都按两个字节编码(WIN7与VS2012使用UNICODE编码方式)
在Windows平台下,采用2字节表示一个字符
DBCS和UNICODE编码的区别
•DBCS字符编码:
A 我 是 程 序 员
01 0203 0405 0607 0809 0A0B
但是解析时,可能为:
01 0203 0405 0607 0809 0A0B
0102 0304 0506 0708 090A 0B
•UNICODE编码:
A 我 是 程 序 员
0001 0203 0405 0607 0809 0A0B
不存在解析的问题
字符集的应用
当没有#define WIDECHAR 的结果
•ASC码
•代码页的切换
设置控制台下,输出的代码页
BOOL SetConsoleOutputCP(
UINT wCodePageID //代码页ID
);
•宽字节字符
wchar_t 每个字符占2个字节
char 每个字符占1个字节或两个字节
wchar_t 实际是 unsigned short 类型,定义时,需要增加“L”,通知编译器按照双字节编译字符串,采用UNICODE编码。
需要使用支持 wchar_t 函数操作宽字节字符串。例如:
wchar_t * pwszText = L"Hello wchar";
wprintf( L"%s\n", pwszText );
例子:(使用窄字节与宽字节计算字符串的字符数)
运行结果图:
当#define WIDECHAR 的结果
例子:(使用窄字节与宽字节计算字符串的字符数)
// WinCharacter.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
#define WIDECHAR
void T_char()
{
#ifdef WIDECHAR
wchar_t *pszText = L"Hello";
wprintf(L"WIDE : %s\n",pszText);
#else
char *pszText = "Hello";
printf("simple : %s\n",pszText);
#endif
}
void C_char()
{
char *pszText = "Hello char";
int nLen = strlen(pszText);
printf("%s - %d\n",pszText,nLen);
}
void W_char()
{
wchar_t *pszText = L"Hello Wchar";
int nLen = wcslen(pszText);
wprintf(L"%s - %d\n",pszText,nLen);
}
int _tmain(int argc, _TCHAR* argv[])
{
C_char();
W_char();
T_char();
return 0;
}
运行结果图:
当#define WIDECHAR 的结果
当没有#define WIDECHAR 的结果
宽字节与窄字节分别有两套适用于自己的函数。