Chrome.exe通過MainDllLoader加載chrome.dll,然後獲取chrome.dll中的ChromeMain函數指針開始運行chrome.dll中的代碼:
- DLLEXPORT int __cdecl ChromeMain(HINSTANCE instance,
- sandbox::SandboxInterfaceInfo* sandbox_info) {
- ChromeMainDelegate chrome_main_delegate;
- return content::ContentMain(instance, sandbox_info, &chrome_main_delegate);
- }
ChromeMain這個函數在chrome\app\chrome_main.cc中。
這裏,它直接調用了content.dll中的content::ContentMain函數(見content\app\content_main.cc):
- int ContentMain(HINSTANCE instance,
- sandbox::SandboxInterfaceInfo* sandbox_info,
- ContentMainDelegate* delegate) {
- scoped_ptr<ContentMainRunner> main_runner(ContentMainRunner::Create());
- int exit_code;
- exit_code = main_runner->Initialize(instance, sandbox_info, delegate);
- if (exit_code >= 0)
- return exit_code;
- exit_code = main_runner->Run();
- main_runner->Shutdown();
- return exit_code;
- }
從這個函數中可以看到,所有的工作都是由ContentMainRunner來驅動的,這個類的定義在content\public\app\content_main_runner.h:
- // This class is responsible for content initialization, running and shutdown.
- class ContentMainRunner {
- public:
- virtual ~ContentMainRunner() {}
- // Create a new ContentMainRunner object.
- static ContentMainRunner* Create();
- // Initialize all necessary content state.
- // The |sandbox_info| and |delegate| objects must outlive this class.
- // |sandbox_info| should be initialized using InitializeSandboxInfo from
- // content_main_win.h.
- virtual int Initialize(HINSTANCE instance,
- sandbox::SandboxInterfaceInfo* sandbox_info,
- ContentMainDelegate* delegate) = 0;
- // Perform the default run logic.
- virtual int Run() = 0;
- // Shut down the content state.
- virtual void Shutdown() = 0;
- };
ContentMainRunner有以下特點:
1. 它是用來初始化、運行並關閉content的;
2. 它是抽象類;
3. 只能通過Create這個靜態成員函數來獲得一個ContentMainRunner類型的對象;
4. Initialize的註釋中提到,sandbox_info和delegate這兩個對象必須要比ContentMainRunner對象活得長,sandbox_info必須用content_main_win.h中的InitializeSandboxInfo初始化。
另外,在content::ContentMain中第五行有這樣一句:
- scoped_ptr<ContentMainRunner> main_runner(ContentMainRunner::Create());
scoped_ptr是一個智能指針,main_runner是這個函數的局部變量,它裏面保存了ContentMainRunner的指針,當這個scope結束的時候,main_runner會被銷燬,同時指針所指向的內容也會被釋放。
Chrome的啓動就先寫到這裏,下次的文章會先介紹ContentMainRunner。