`
buliedian
  • 浏览: 1197904 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

让你的代码在 main 或者 WinMain 之前执行!

阅读更多

目标环境: 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

分享到:
评论

相关推荐

    多线程 :编写一个耗时的单线程程序:

    进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。  线程是进程...

    多线程编程系列

    进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。  线程是进程...

    VC多线程开发实例

    多线程概述 ...系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。

    多线程编程(完整版)

    系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。  每一个进程至少有一个...

    windows 程序设计

    主要的区别在于C语言链接库函数的机械码连结到您的程序代码中,而Windows函数的程序代码在您程序执行文件外的DLL中。 当您执行Windows程序时,它通过一个称作「动态链接」的过程与Windows相接。一个Windows的.EXE...

    VC学习文档 当对两个值做比较的时候,将常量放在前面,如果逻辑错误的话,编译时就会出错,例如:

    当对两个值做比较的时候,将常量放在前面,如果逻辑错误的话,编译时就会出错,例如: If(1=x) 应该写成if(1==x),这样编译时就会出错。 C++当中的结构体里可以出现函数,而c语言不可以 ...代码再入口函数之前执行。

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    该资料是《Visual C++ 2010入门经典(第5版)》的源代码及课后练习答案 对应的书籍资料见: Visual C++ 2010入门经典(第5版) 基本信息 原书名: Ivor Horton's Beginning Visual C++ 2010 原出版社: Wrox 作者: ...

    Windows进程观测

    在进行某些设置后,进入开发者提供的main() 、ServiceMain() 或WinMain() 函数的低级入口点。机器代码中包括有控制逻辑,它所做的事包括跳转到Windows API函数,进行计算或向磁盘写入数据等。 Windows允许开发人员将...

    MFC的程序框架剖析

    7、对于普通的VC++控制台程序,无论全局变量还是全局对象,程序运行时,在加载main函数之前,就已经为它们 分配了内存空间。对于一个全局对象来说,此时就会调用该对象的构造函数,构造该对象,并进行初始化操作 8、...

    Visual C++ 2005入门经典--源代码及课后练习答案

    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 ...

    C++、C语言和JAVA开发的区别

    而java从娘胎里出来就是为了跨平台执行的,不采 用二进制机器码作为最终代码,所以在移植方面较好。 3。C++的指针操作使得它不安全。 java没有指针,而C++的指针越界或野指针是造成弄脏内存的重

    PT80-NEAT开发指南v1.1

    NEAT 程序一般执行过程 ..................................................................................................................... 20 第四章 窗口 ................................................

    RINGSDK包含界面库和图象库。

    NewRingObj产生的窗口类对象的父窗口取决于调用该函数的窗口对象,比如你在主窗口对象内部调用: RINGMAINMSG(WM_CREATE) { ChildWin = NewRingObj(ChildWin); ... } 则ChildWin的父窗口为主窗口。也可以用...

    HGE_系列教材(1-9)

    System_Launch 运行一个URL 或者外部的可执行文件或数据文件 System_Snapshot 截屏并保存到一个文件 3. 资源函数(Resource functions): Resource_Load 从硬盘上读取资源到内存中 Resource_Free 从内存中删除读取...

    最新名企标准通用C++面试题,

    //全局变量的动态空间申请在程序运行之后,main运行之前完成。所以不是所有的动作都是main引起的。 int main() { char *des="abc"; cout; getchar(); } 12.C++里面如何声明const void f(void)函数为C程序中的...

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    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程序 ...

    Visual C++ 2005入门经典.part04.rar (整理并添加所有书签)

    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程序 ...

    Visual C++ 2005入门经典.part07.rar (整理并添加所有书签)

    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程序 ...

    Visual C++ 2005入门经典.part09.rar (整理并添加所有书签)

    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程序 ...

Global site tag (gtag.js) - Google Analytics