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。

你可能感兴趣的:(code,chrome,source)