从前面几篇,我们已经得到一些结论。
程序是可以自定义入口的,但是如果在入口中使用了一些CRT相关的函数,而没有正确的进行初始化工作的话,即使编译不出问题,在运行时也会出现内存错误等问题的。
那我们可以写出完全不用到CRT库的程序吗?当然可以,既然CRT库也是微软写的,甚至我们可以用另外一个CRT库来代替它。不过这个算是另外一个话题了。先看看不使用CRT库的hello world是啥样的吧。
不使用C运行时库的测试代码
#include
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
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com