从零开始,学习windows编程(7)--不使用CRT库的程序

从前面几篇,我们已经得到一些结论。

程序是可以自定义入口的,但是如果在入口中使用了一些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.exekrnl286.exekrnl386.exe系统文件中;以及32位元Windows下的 kernel32.dlladvapi32.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之下。

这里,暂时就这么多了,你,见过自定义入口的程序吗?可以拿出来和大家共享吗?

参考:

  1. http://zh.wikipedia.org/wiki/Windows_API

posted on 2011-06-23 20:00  cnyao  阅读(3127)  评论(3编辑  收藏  举报