Chrome代碼筆記 1 -- Chrome的啓動 II

Chrome.exe通過MainDllLoader加載chrome.dll,然後獲取chrome.dll中的ChromeMain函數指針開始運行chrome.dll中的代碼:

  1. DLLEXPORT int __cdecl ChromeMain(HINSTANCE instance,  
  2.                                  sandbox::SandboxInterfaceInfo* sandbox_info) {  
  3.   ChromeMainDelegate chrome_main_delegate;  
  4.   return content::ContentMain(instance, sandbox_info, &chrome_main_delegate);  

ChromeMain這個函數在chrome\app\chrome_main.cc中。

這裏,它直接調用了content.dll中的content::ContentMain函數(見content\app\content_main.cc):

  1. int ContentMain(HINSTANCE instance,  
  2.                 sandbox::SandboxInterfaceInfo* sandbox_info,  
  3.                 ContentMainDelegate* delegate) { 
  4.  
  5. scoped_ptr<ContentMainRunner> main_runner(ContentMainRunner::Create()); 
  6.  
  7. int exit_code; 
  8.  
  9. exit_code = main_runner->Initialize(instance, sandbox_info, delegate); 
  10.  
  11.   if (exit_code >= 0)  
  12.     return exit_code; 
  13.  
  14.   exit_code = main_runner->Run(); 
  15.  
  16.   main_runner->Shutdown(); 
  17.  
  18.   return exit_code;  

從這個函數中可以看到,所有的工作都是由ContentMainRunner來驅動的,這個類的定義在content\public\app\content_main_runner.h:

  1. // This class is responsible for content initialization, running and shutdown.  
  2. class ContentMainRunner {  
  3. public:  
  4.   virtual ~ContentMainRunner() {} 
  5.  
  6.   // Create a new ContentMainRunner object.  
  7.   static ContentMainRunner* Create(); 
  8.  
  9.   // Initialize all necessary content state.  
  10.   // The |sandbox_info| and |delegate| objects must outlive this class.  
  11.   // |sandbox_info| should be initialized using InitializeSandboxInfo from  
  12.   // content_main_win.h.  
  13.   virtual int Initialize(HINSTANCE instance,  
  14.                          sandbox::SandboxInterfaceInfo* sandbox_info,  
  15.                          ContentMainDelegate* delegate) = 0;  
  16.  
  17.   // Perform the default run logic.  
  18.   virtual int Run() = 0; 
  19.  
  20.   // Shut down the content state.  
  21.   virtual void Shutdown() = 0;  
  22. }; 

ContentMainRunner有以下特點:

1. 它是用來初始化、運行並關閉content的;

2. 它是抽象類;

3. 只能通過Create這個靜態成員函數來獲得一個ContentMainRunner類型的對象;

4. Initialize的註釋中提到,sandbox_info和delegate這兩個對象必須要比ContentMainRunner對象活得長,sandbox_info必須用content_main_win.h中的InitializeSandboxInfo初始化。

另外,在content::ContentMain中第五行有這樣一句:

  1. scoped_ptr<ContentMainRunner> main_runner(ContentMainRunner::Create()); 

scoped_ptr是一個智能指針,main_runner是這個函數的局部變量,它裏面保存了ContentMainRunner的指針,當這個scope結束的時候,main_runner會被銷燬,同時指針所指向的內容也會被釋放。

Chrome的啓動就先寫到這裏,下次的文章會先介紹ContentMainRunner。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章