目标环境: WindowXP SP3 + VS2008.NET
开发语言: C/C++
目标生成: Console Application and Window Application.
有的时候,需要会遇到这样的一个情况,“想要在main或者WinMain函数执行前初始化我们的系统框架,和在之后释放我们的系统框架”, 如果这样,我们该怎么做呢?笔者今天放假,来公司继续解决昨天剩余的问题,然后调试exit函数的时候,会发现它会调用
static void __cdecl doexit (int code,int quick,int retcaller)这样的一个内部函数,那么继续单步调试,那么你就会发现
这段代码,OK,我们移上去(function_to_call)看看,你会发现是那些全局类变量的析构调用,那么我们继续往下面走,_initterm(__xp_a, __xp_z); 这个函数, 我第一次看到这个函数的时候,莫名其妙想在里面做文章了。。。OK,我们去看看这个函数内部到底是干什么的
很容易就可以看到,他就是一个循环遍历,执行每个元素,而仔细看看,那每个元素不就是一个函数指针吗? OK,我们想实现前面所说的功能,该怎么做呢?怎么能够自动往里面添加我们的函数指针呢? 如果能够自由添加我们的函数指针的话,就可以在main和WinMain之前,之后分别调用我们自己的 “初始化”“退出”函数了。那么我们继续在这个源文件中“crt0dat.c”中看看其他代码,或许你会幸运的发现如下代码:
MS也给我们写了一点注释, __xi_a[] 到 __xi_z[] 是用于 C语言初始化用的, __xc_a[] 到 __xc_z[] 适用于C++初始化用的,而
__xp_a[] 到 __xp_z[] 适用于C基本库预结束用的, __xt_a[] 到 __xt_z[] 适用于C基本库结束用的。通过这里,我们可以看到那个字符串中的英文字母".CRT$XIA" - ".CRT$XIZ", 我们可以分析出一些简单的规律,
I --> C initialize;
C --> C++ Initialize
P --> C PreUninitialize
T --> CUninitialize
这时候,我们需要查找 _CRTALLOC 宏定义, 通过查找它所引用的头文件,可以看到其中的sect_attribs.h:
OK,得到上述的那些信息,我们可以开始尝试了,输入以下代码:
那么,你可以Ctrl+F5测试一下, 你可以看到 init A() main() ~A() uninit 这样的顺序,呵呵,总之目标实现啦,其实原理也很简单的,我就不讲啦, 杭州天气太热了。。。
参考文章:
1. http://www.codeguru.com/cpp/misc/misc/threadsprocesses/article.php/c6945__1/Running-Code-Before-and-After-Main.htm
2. http://book.51cto.com/art/200904/121077.htm
分享到:
相关推荐
进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。 线程是进程...
进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。 线程是进程...
多线程概述 ...系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。
系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。 每一个进程至少有一个...
主要的区别在于C语言链接库函数的机械码连结到您的程序代码中,而Windows函数的程序代码在您程序执行文件外的DLL中。 当您执行Windows程序时,它通过一个称作「动态链接」的过程与Windows相接。一个Windows的.EXE...
当对两个值做比较的时候,将常量放在前面,如果逻辑错误的话,编译时就会出错,例如: If(1=x) 应该写成if(1==x),这样编译时就会出错。 C++当中的结构体里可以出现函数,而c语言不可以 ...代码再入口函数之前执行。
该资料是《Visual C++ 2010入门经典(第5版)》的源代码及课后练习答案 对应的书籍资料见: Visual C++ 2010入门经典(第5版) 基本信息 原书名: Ivor Horton's Beginning Visual C++ 2010 原出版社: Wrox 作者: ...
在进行某些设置后,进入开发者提供的main() 、ServiceMain() 或WinMain() 函数的低级入口点。机器代码中包括有控制逻辑,它所做的事包括跳转到Windows API函数,进行计算或向磁盘写入数据等。 Windows允许开发人员将...
7、对于普通的VC++控制台程序,无论全局变量还是全局对象,程序运行时,在加载main函数之前,就已经为它们 分配了内存空间。对于一个全局对象来说,此时就会调用该对象的构造函数,构造该对象,并进行初始化操作 8、...
CruiseYoung提供的带有详细书签的电子书籍目录 ... 该资料是《Visual C++ 2005... 11.2.1 WinMain()函数 583 11.2.2 消息处理函数 594 11.2.3 简单的Windows程序 598 11.3 Windows程序的组织 600 11.4 MFC 601 ...
而java从娘胎里出来就是为了跨平台执行的,不采 用二进制机器码作为最终代码,所以在移植方面较好。 3。C++的指针操作使得它不安全。 java没有指针,而C++的指针越界或野指针是造成弄脏内存的重
NEAT 程序一般执行过程 ..................................................................................................................... 20 第四章 窗口 ................................................
NewRingObj产生的窗口类对象的父窗口取决于调用该函数的窗口对象,比如你在主窗口对象内部调用: RINGMAINMSG(WM_CREATE) { ChildWin = NewRingObj(ChildWin); ... } 则ChildWin的父窗口为主窗口。也可以用...
System_Launch 运行一个URL 或者外部的可执行文件或数据文件 System_Snapshot 截屏并保存到一个文件 3. 资源函数(Resource functions): Resource_Load 从硬盘上读取资源到内存中 Resource_Free 从内存中删除读取...
//全局变量的动态空间申请在程序运行之后,main运行之前完成。所以不是所有的动作都是main引起的。 int main() { char *des="abc"; cout; getchar(); } 12.C++里面如何声明const void f(void)函数为C程序中的...
11.2.1 WinMain()函数 11.2.2消息处理函数 11.2.3简单的Windows程序 11.3 Windows程序的组织 11.4 MFC 11.4.1 MFC标记法 11.4.2 MFC程序的组织方式 11.5使用Windows Forms 11.6小结 第12章 使用MFC编写Windows程序 ...
11.2.1 WinMain()函数 11.2.2消息处理函数 11.2.3简单的Windows程序 11.3 Windows程序的组织 11.4 MFC 11.4.1 MFC标记法 11.4.2 MFC程序的组织方式 11.5使用Windows Forms 11.6小结 第12章 使用MFC编写Windows程序 ...
11.2.1 WinMain()函数 11.2.2消息处理函数 11.2.3简单的Windows程序 11.3 Windows程序的组织 11.4 MFC 11.4.1 MFC标记法 11.4.2 MFC程序的组织方式 11.5使用Windows Forms 11.6小结 第12章 使用MFC编写Windows程序 ...
11.2.1 WinMain()函数 11.2.2消息处理函数 11.2.3简单的Windows程序 11.3 Windows程序的组织 11.4 MFC 11.4.1 MFC标记法 11.4.2 MFC程序的组织方式 11.5使用Windows Forms 11.6小结 第12章 使用MFC编写Windows程序 ...