posts - 17,comments - 7,trackbacks - 0

                                                                     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 (intchar *[]); 
 2 __declspec (dllimport) int ace_os_main_i (ACE_Main_Base&intchar *[]); 
 3 class ACE_Main : public ACE_Main_Base 
 4 {
 5     int run_i (intchar *[]);
 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 。。。。 阅读(2264) 评论(2)  编辑 收藏 引用 所属分类: ACE

FeedBack:
# re: ACE程序入口main?
2008-04-08 09:32 | true
希望看到更多的ace文章  回复  更多评论
  
# re: ACE程序入口main?
2014-12-03 11:44 | hhh
刚开始看ace源码,在使用ACE_FILE_Connector的connect时一直失败跟源码发现ACE_OS_Object_Manager没有初始化,把main改成ACE_TMain后就好了。原来如此,再结合源码看看,谢谢楼主。  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理