ACE程序的入口点
--loky 2008.4.7
用过ACE的都知道,我们的主函数被改写了,加入了初始化的动作。主函数是被宏替换的。下面我们把main的宏替换内容找出来。输出宏的代码如下:
1 #include <ace/Log_Msg.h>
2 #define MACRO_(x) #x
3 #define DISPLAY_MACRO(x) (printf("%s",MACRO_(x)))
4
5 int main(int argc, char* argv[])
6 {
7 DISPLAY_MACRO(main);
8 return 0;
9 };
展开后的main为:
1 ace_main_i (int, char *[]);
2 __declspec (dllimport) int ace_os_main_i (ACE_Main_Base&, int, char *[]);
3 class ACE_Main : public ACE_Main_Base
4 {
5 int run_i (int, char *[]);
6 };
7 inline int ACE_Main::run_i (int argc, char *argv[])
8 {
9 return ace_main_i (argc, argv);
10 }
11 int main (int argc, char *argv[])
12 {
13 ACE_Main m;
14 return ace_os_main_i (m, argc, argv);
15 } int ace_main_i
这样我们的原main函数变成了ace_main_i (int, char *[]);//15行
而在这之前先执行了int ace_os_main_i (ACE_Main_Base&, int, char *[]); //14行
我们来看看这个函数
1 ACE_Export int
2 ace_os_main_i (ACE_Main_Base &mbase, int argc, char *argv[]) /* user's entry point, e.g., main */
3 {
4 ACE_MAIN_OBJECT_MANAGER
5 return mbase.run (argc, argv); /* what the user calls "main" */
6 }
ACE_MAIN_OBJECT_MANAGER,这个宏完成了我们的初化化动作,声明了一个ACE_OS_Object_Manager对象,构造函数中调用了init ()来初始化。init就是最后真正的初始化执行函数。这也是ACE程序为什么在MFC中要加入init()函数的原因,因为MFC不能通过main的展开来进行初始化。
初始化完成后,程序是怎么回到我们的业务处理上的呢,这个函数又调用了mbase的run,就是展开后的主函数中的m对象的run,而run函数又做了什么呢?
代码会告诉我们:
1 int ACE_Main_Base::run (int argc, char *argv[])
2 {
3 return this->run_i (argc, argv);
4 }
run又调用了,ACE_Main_Base::run_i (argc, argv);
根据main宏展开后的代码,我们发现run_i中调用了ace_main_i (int, char *[]),而这个函数就是我们程序中被替换掉的主函数,终于又转到我们的处理单元来了。
posted on 2008-04-07 22:15
。。。。 阅读(2600)
评论(2) 编辑 收藏 引用 所属分类:
ACE