windows应有程序开发系列三:基础知识准备

来源:互联网 发布:mysql union group 编辑:程序博客网 时间:2024/06/05 00:45

昨天晚上睡觉前突然想起了一个问题,我用的开发工具是VC6.0,这是因为,我尝试过很多次安装visual stdio的各个版本,最终都以失败告终,大概是因为的win7版本不怎么好吧,无奈之下只好选用VC6.0。好了,开始今天的主菜。

一、理论知识讲解

1 windows头文件介绍

(a) windows.h——所有的windows头文件的集合,包含了95%以上的windows API函数。

(b) winnt.h——windows字符集头文件

2 资源脚本文件(后缀为.rc的文件),自己指定图标。但是图片格式有要求,必须以.ico为后缀的格式。

(1) 准备一副.ico格式的图标。

(2) 自己动手编写一个.rc脚本文件,我这里写的文件名叫做hello.rc,需要说明的是,现实中不需要自己手动编译,由开发工具自动生成。

<span style="white-space:pre"></span>100 ICON 130316979.ico

用rc.exe编译器对hello.rc文件进行编译,如果编译成功,就会生成hello.RES二进制文件。

(3)用link.exe连接各个目标文件。

(4) 最终生成的hello.exe文件图标如下

以上是手动指定可执行文件的完整过程,实际中由开发工具自动执行,并不需要这么做,但是作为一个c/c++程序员,这样显得比较专业(勿拍砖啊)!

3 makefile文件介绍 

(1)手动写一个makefile文件(.mak后缀的文件)

HELLO:  cl.exe /c hello.c  rc.exe hello.rc  link.exe hello.obj hello.RES user32.lib
(2)执行makefile文件——nmake命令

在命令行输入nmake hello.mak命令,如果成功,就会生成要得到的文件。

实际的makefile文件中可以有多个依赖行。执行makefile文件的时候,系统默认执行第一个依赖行的内容,后面的依赖行都不执行。

HELLO:  cl.exe /c hello.c  rc.exe hello.rc  link.exe hello.obj hello.RES user32.libCLEAN:  del *.obj  del *.RES  del *.exe

注:HELLO和CLEAN表示依赖行,这个程序员可以自己指定,可以为任何内容(除汉语)

选择执行依赖行:

nmake /f hello.mak CLEAN

注:一种/f表示选择

此外HELLO:CLEAN,表示HELLO依赖于CLEAN,先执行依赖的内容,即先执行CLEAN命令,后执行HELLO命令,炫酷吧。

4 字符编码

ASC —— 7位代表一个字符,128个字符,美国人使用的字符

ASCII —— 8位代表一个字符,256个字符,加入了一些其他国家的字符。 

MBCS方式,这是一个编码族

DBCS —— 微软在中国使用的一个编码分支,单双字节混合编码,即英文占用一个字节,汉字占2个字节。(计算机的主流编码方式)

A 我 是 程 序 员

01 0203 0405 0607 0809 0A0B

0102 0304 0506 0708 090A 0B(这种编码方式存在这样的巨大缺陷,也就是乱码)

UNICODE编码族,解决了DBCS编码的问题。

UTF8—— LUNIX编码方式

UCS16——微软采用的方式,全部占用两个字节,英文字符高位补零。

5 宽字节字符

char  每个字符占1个字节或2个字节,采用DBCS编码方式

wchar_t 每个字符占2个字节,采用UNICODE编码方式,wchar_t 实际是 unsigned short 类型,定义时, 需要增加“L”,通知编译器按照双字节编译字符串,采用UNICODE编码。需要使用支持 wchar_t 函数操作宽字 节字符串。例如:

wchar_t * p = L"Hello wchar";

  wprintf( L"%s\n", p );

一个小小的例子:

#include "stdafx.h"#include "stdio.h"#include "windows.h"/*  * 1 char字符的操作*/void C_char(){char *p = "肖申克的救赎";printf("%s\n",p);}/*  * 2 wchar_t字符的操作,wcslen()属于windows的API函数,需要包含头文件windows.h*/void W_char(){wchar_t *p = L"泰坦尼克号";int nLen = wcslen(p);wprintf(L"%s %d\n",p,nLen);}int main(int argc, char* argv[]){C_char();W_char();return 0;}
实际上,微软已经重新定义了一种TCHAR类型的数据类型,根据条件不同,它可以是wchar_t或者char

TCHAR *p = __TEXT("hello");
二、今天没什么代码实践的内容。可能今天的内容有点晕,但是没有关系,权当延伸。

三、

最后留下来一个问题,看看上面的代码能否得到想要的结果。曾经这个问题也困扰了我一阵子,所以我在这里暂且卖一下关子,预知后事如何,且听我下回分解!



0 0
原创粉丝点击