从零开始,学习windows编程(7)--不使用CRT库的程序
来源:互联网 发布:开淘宝网店怎么上货 编辑:程序博客网 时间:2024/05/21 11:01
从前面几篇,我们已经得到一些结论。
程序是可以自定义入口的,但是如果在入口中使用了一些CRT相关的函数,而没有正确的进行初始化工作的话,即使编译不出问题,在运行时也会出现内存错误等问题的。
那我们可以写出完全不用到CRT库的程序吗?当然可以,既然CRT库也是微软写的,甚至我们可以用另外一个CRT库来代替它。不过这个算是另外一个话题了。先看看不使用CRT库的hello world是啥样的吧。
不使用C运行时库的测试代码
#include <windows.h>
DWORD
StringLen(
const
char
* str)
{
const
char
*eos = str;
while
( *eos++ ) ;
return
( (
DWORD
)(eos - str - 1) );
}
void
WriteString(
const
char
* str)
{
HANDLE
hOut;
DWORD
Length;
DWORD
result;
hOut=GetStdHandle(STD_OUTPUT_HANDLE);
Length=StringLen(str);
WriteFile(hOut,str,Length,&result,0);
}
int
myentry(
void
)
{
WriteString(
"Hello World!"
);
ExitProcess(0);
return
0;
}
编译:
cl /c /Zl myentrytest.c
链接:
link /entry:myentry /subsystem:console myentrytest.obj kernel32.lib
最终得到可执行文件myentrytest.exe。
执行效果与printf出来的效果相同,但是其中用到的原理却是很不一样的。
这里,我们就接触到了三个函数,这三个函数可以不通过CRT库直接使用,并且不造成任何问题,这三个函数都是所谓的Windows API。这三个API都是kernel32提供的。通过直接调用windows API,可以使用到操作系统的功能,并成功绕过CRT库。尽管我们平时不太会使用到这样的技巧,但是有时接触到这样的代码或自己编码时有这样的要求,也是可能的。当然,要完全绕过CRT库,就需要提取出所编写程序要使用到CRT库提供功能的所有函数,并使用windows API来同等代替,这样花费的时间和重复做轮子也没什么两样,不过,如果要真的对系统有一定了解,还是有一定意义的。
这里介绍一下windows API:
视窗操作系统应用程序接口(Windows API),有非正式的简称法为WinAPI,是微软对于Windows操作系统中可用的核心应用程序编程接口的称法。它被设计为各种语言的程序调用,也是应用软件与Windows系统最直接的交互方式。大多数驱动程序所需要的对Windows系统的更底层次访问接口,由所用版本的Windows的Native API来提供接口。
Windows有一个软件开发包(SDK, software development kit)提供相应的文档和工具,以使程序员开发使用Windows API的软件和利用Windows技术。
Windows API所提供的功能可以归为七类:[4]
- 基础服务(Base Services)[5],提供对Windows系统可用的基础资源的访问接口。比如象:文件系统(file system)、外部设备(device)、,行程(process)、线程(thread)以及访问注册表(Windows registry)和错误处理机制(error handling)。这些功能接口位于,16位元Windows下的kernel.exe、krnl286.exe或krnl386.exe系统文件中;以及32位元Windows下的 kernel32.dll和advapi32.dll中。
- 图形设备接口(GDI)[6],提供功能为:输出图形内容到显示器、打印机以及其他外部输出设备。它位于16位元Windows下的gdi.exe;以及32位元Windows下的gdi32.dll。
- 图形化用户界面(GUI)[7],提供的功能有创建和管理屏幕和大多数基本控件(control),比如按钮和滚动条。接收鼠标和键盘输入,以及其他与GUI有关的功能。这些调用接口位于:16位元Windows下的user.exe,以及32位元Windows下的user32.dll。从Windows XP版本之后,基本控件和通用对话框控件(Common Control Library)的调用接口放在comctl32.dll中。
- 通用对话框链接库(Common Dialog Box Library)[8],为应用程序提供标准对话框,比如打开/保存文件对话框、颜色对画框和字体对话框等等。这个链接库位于:16位元Windows下的commdlg.dll中,以及32位元Windows下comdlg32.dll中。它被归类为User Interface API之下。
- 通用控件链接库(Common Control Library)[9],为应用程序提供接口来访问操作系统提供的一些高级控件。比如像:状态栏(status bar)、进度条(progress bars)、工具栏(toolbar)和标签(tab)。这个链接库位于:16位元Windows下的commctrl.dll中,以及32位元Windows下comctl32.dll中。。它被归类为User Interface API之下。
- Windows外壳(Windows Shell)[10][11],作为Windows API的组成部分,不仅允许应用程序访问操作系统shell提供的功能,还对之有所改进和增强。它位于16位元Windows下的shell.dll中,以及32位元Windows下的shell32.dll中(Windows 95则在 shlwapi.dll中)。 它被归类为User Interface API之下。
- 网络服务(Network Services)[12],为访问操作系统提供的多种网络 功能提供接口。它包括NetBIOS、Winsock、NetDDE及RPC等。
这里,暂时就这么多了,你,见过自定义入口的程序吗?可以拿出来和大家共享吗?
参考:
- http://zh.wikipedia.org/wiki/Windows_API
- 从零开始,学习windows编程(7)--不使用CRT库的程序
- 从零开始,学习windows编程(8)--自己动手,编译CRT
- 从零开始,学习windows编程(8)--自己动手,编译CRT
- Windows下编程,使用CRT库查找内存泄漏。
- 从零开始,学习windows编程(5)--修改入口不为mainCRTStartup
- 从零开始,学习windows编程(3)—hello.c的疑惑
- 从零开始,学习windows编程(3)—hello.c的疑惑
- 从零开始,重新学习windows编程(2)--环境准备,不用IDE编写程序
- 从零开始,重新学习windows编程(2)--环境准备,不用IDE编写程序
- 用Crt系列函数分析windows程序的内存泄露
- 基于 crt debug 实现的 Windows 程序内存泄漏检测工具
- 用Crt系列函数分析windows程序的内存泄露
- 从零开始学习音视频编程技术(四) FFMPEG的使用
- 从零开始学习音视频编程技术(四) FFMPEG的使用
- 从零开始,学习windows编程(6)--改换entry,link错误的简单分析
- Windows编程 C++ DLL编程 学习笔记(一)静态链接库的创建和使用
- Windows编程 C++ DLL编程 学习笔记(一)静态链接库的创建和使用
- Linux与windows的CRT
- 从零开始,学习windows编程外篇(1)--分析lib文件
- C程序小结3
- Hibernate双向1-N关联的简单示例
- iphone 重用机制
- 人不成熟的六大特征
- 从零开始,学习windows编程(7)--不使用CRT库的程序
- malloc/free/堆、栈的知识点归纳
- shell 日期时间转换秒数 命令
- C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法
- A. Difference Row
- iOS UIControl 几个事件的说明(转载)
- 从零开始,学习windows编程(8)--自己动手,编译CRT
- 0924
- Samza,是一个分布式流处理框架,专用于实时数据的处理,非常像Twitter的流处理系统Storm,近日LinkedIn开源了这项技术。本文介绍了搭配使用Kafka和YARN的一些特点和优势。