2013.7.27 学习笔记《windows核心编程》(三) 资源与字符编码

《windows核心编程》(三)-----------2013.7.27

一、概念

资源的使用
•编写资源的文件 -.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字节表示一个字符

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
         不存在解析的问题

字符集的应用
•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 );

例子:(使用窄字节与宽字节计算字符串的字符数)

// 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 的结果



宽字节与窄字节分别有两套适用于自己的函数。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值