• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            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 。。。。 閱讀(2649) 評論(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后就好了。原來如此,再結合源碼看看,謝謝樓主。  回復  更多評論
              
            无码精品久久久久久人妻中字| 久久国产精品无码一区二区三区 | 日韩亚洲欧美久久久www综合网 | 武侠古典久久婷婷狼人伊人| 欧美日韩久久中文字幕| 亚洲中文字幕无码久久2020| 久久九九亚洲精品| 免费久久人人爽人人爽av| 久久综合九色综合97_久久久| 久久精品免费大片国产大片| 无码AV中文字幕久久专区| 国产精品成人久久久久三级午夜电影 | 久久91精品国产91| 久久最新精品国产| 欧美午夜精品久久久久免费视| 久久久中文字幕| 97精品依人久久久大香线蕉97| 久久国产成人| 中文字幕成人精品久久不卡| 国产精品99久久久久久宅男小说| 久久本道伊人久久| 久久99国产乱子伦精品免费| 久久91精品国产91| 一级a性色生活片久久无| 99久久久久| 夜夜亚洲天天久久| 97热久久免费频精品99| 亚洲AV日韩AV永久无码久久| 99精品国产免费久久久久久下载| 久久国产精品免费一区二区三区| 国产亚洲精久久久久久无码| 亚洲人成网亚洲欧洲无码久久| 久久这里只精品99re66| 亚洲欧美一区二区三区久久| 香港aa三级久久三级老师2021国产三级精品三级在 | 欧美成人免费观看久久| 久久综合狠狠综合久久97色| 久久人人爽人人澡人人高潮AV | 香蕉99久久国产综合精品宅男自 | 久久久久久国产a免费观看黄色大片 | 精品无码久久久久国产|