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。

浙公网安备 33010602011771号