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); 
5 }

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; 
19 }

从这个函数中可以看到,所有的工作都是由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。

posted @ 2013-02-18 16:21  AngeloQ  阅读(1720)  评论(1)    收藏  举报