1.2. chromium源代码分析 - chromiumframe - 入口函数

ChromiumFrame的入口函数在main.cpp中,打开main.cpp.
中包含3个类和_tWinMain函数。
_tWinMain就是我们要找的入口函数。我做了部分注释:

 1 int APIENTRY _tWinMain(HINSTANCE hInstance,
 2                        HINSTANCE hPrevInstance,
 3                        LPTSTR    lpCmdLine,
 4                        int       nCmdShow)
 5 {
 6     // 1. 支持OLE,退出管理机制,GDIPlus 初始化,本地资源管理(new)
 7     HRESULT hRes = OleInitialize(NULL);
 8     base::AtExitManager exit_manager;
 9     gfx::GdiplusInitializer gdiplus_initializer;
10     gdiplus_initializer.Init();
11     ResourceBundle::InitSharedInstance(base::FilePath());
12     ResourceBundle::GetSharedInstance().SetIdConveter(new AppIdConveter());
13
14     // 2. 创建窗口(包含WNDCLASS注册)
15     view::AcceleratorHandler handler;
16     MessageLoop loop(MessageLoop::TYPE_UI);
17     MainWindowDelegate delegate;
18     view::Window::CreateNativeWindow(NULL, gfx::Rect(), &delegate);
19     delegate.window()->SetWindowBounds(gfx::Rect(0, 0, 500, 500), NULL);
20     delegate.window()->Show();
21
22     // 3. 启动消息循环
23     MessageLoopForUI::current()->Run(&handler);
24
25     // 4. 退出处理(new)
26     ResourceBundle::CleanupSharedInstance();
27     gdiplus_initializer.UnInit();
28     OleUninitialize();
29 }

参考注释,发现这里只比1.1中提到win32典型程序的WinMain多了 支持OLE,退出管理机制,GDIPlus 初始化,本地资源管理。

1.1文中提到的1. WNDCLASS注册   2. 窗口的创建   3. 启动消息循环也被包装后,在这里都有调用。骨架未变,只是包装上了华丽的Message framework。

注册WNDCLASS和创建窗口在这里:

1 view::Window::CreateNativeWindow(NULL, gfx::Rect(), &delegate);

消息循环在这里:

1 MessageLoopForUI::current()->Run(&handler);

3个类分别是MainView / MainWindowDelegate / AppIdConveter

1. 最重要的就是MainWindowDelegate类,MainWindowDelegate继承自WindowDelegate,WindowDelegate是窗口类一个委托类,通过在MainWindowDelegate重载虚函数,从而达到控制窗口的行为。需要提一下的是,google这里是完全的面向对象,而非MFC中使用set方式来设置窗口的行为。这样的方式在chromium中比比皆是。不要被弄的晕头转向才好。
2. AppIdConveter类,只是资源ID转换的一个辅助类而已。

3. MainView控制窗口中view的行为,这里只是告知了view的大小。在MainWindowDelegate中告知窗口的包含view就是MainView,窗口的大小也就跟随了包含view的大小。(其中关系并非这么简单,但暂时可以这么理解)

接下来就由_tWinMain出发了解view framework.

时间: 2024-11-07 02:37:29

1.2. chromium源代码分析 - chromiumframe - 入口函数的相关文章

1.1. chromium源代码分析 - chromiumframe - 介绍

本人能力有效,面对chromium庞大的代码就头大.还是先由前辈的chromiumFrame入手. 1. chromeFrame概貌 chromiumFrame是前辈的心血之作,以最小化的方式抽出chromium界面部分的代码,并以demo的方式展现给我.让我可以不用直接面对chromium这样的庞然大物. 先看看chromiumFrame目录结构, animation,静态库,动画类. base,基础静态库,一些logging,只能指针等基础的东东. gfx,画图的基础库,对windows上的

1.4. chromium源代码分析 - chromiumframe - 消息系列

Message framework 是对消息循环的封装和扩展,Chromium在消息循环中增加处理内部任务的工作.将内部工作处理寄生在Windows的消息循环中,会有一个问题,就是没有Windows自身消息,而有Chromium内部工作,此时内部动作就无法及时处理.Chromium这里定义了一个自定义消息kMsgHaveWork,用来在Chromium内部有工作的时候,驱动Windows的消息一直会运行. 从代码级别来说,Chromium内部工作队列被塞入工作时Post一条kMsgHaveWor

gcc源代码分析,debug_tree()函数,又一利器啊

gcc源代码分析,debug_rtx()函数,利器啊 print-tree.c #include "config.h" #include "tree.h" #include <stdio.h> /* Names of tree components. Used for printing out the tree and error messages.  */ #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,

0. chromium源代码分析 - 序

本打算在CSDN写完这系列文字,却因为在CSDN中误删了一篇blog,该篇blog被移到了回收站.然而CSDN居然没有从回收站撤销删除的操作方法.联想到之前CSDN泄密的问题,其可靠性值得怀疑.随转向CNBlog来写这些文字. 偷得浮生半日闲.忙中偷闲看看chromium代码.看过一段,不禁感慨,不亏是一流的公司,写出的架构也是不一般.不看代码,就凭chrome在windows上运行的效率也能感受到chromium代码上的高效. 本人能有幸看到chromium的源代码,还要感谢google为开源

原创:Twemproxy源码分析之一 入口函数及启动过程

最近开始研究twemproxy先将其中的知识点归纳整理一下.作为一个系列的知识点. 一.Twemproxy简介 Twemproxy是memcache与redis的代理,由twitter公司开发并且目前已经开源.研究这个对于理解网络通信有很大的帮助. 亮点有以下: 1.twemproxy自己创建并维护和后端server(即reids实例)的长连接,保证长连接对于来自不同client但去向同一server的复用. 2.自动识别异常状态的server,保证之后的请求不会被转发到该异常server上.但

ReactJS分析之入口函数render

前言 在使用React进行构建应用时,我们总会有一个步骤将组建或者虚拟DOM元素渲染到真实的DOM上,将任务交给浏览器,进而进行layout和paint等步骤,这个函数就是React.render().首先看下该函数的接口定义: ReactComponent render( ReactElement element, DOMElement container, [function callback] ) 接收2-3个参数,并返回ReactComponent类型的对象,当组件被添加到DOM中后,执

gcc源代码分析,expand_call()函数和printf(&quot;Hello, world!\n&quot;);的关系

expand_call()函数在expr.c文件中. 下面是expand_call()函数的主要调试结果,记录之. 主要是加入了debug_tree()函数和debug_rtx()函数. debug_tree()函数加入到了expand_expr()函数的开始. debug_rtx()函数加入到了gen_rtx()函数的结束处. emit_call_1()函数是何时调用的也能看出.emit_call_insn()是何时调用的也能看出. 主要的调试目的是expand_call()函数是如何生成rt

gcc源代码分析,expand_call ()函数分析第五部分,store_one_arg ()函数

本文主要是分析store_one_arg ()函数和expand_expr ()的关系来说明如何处理 函数的参数.printf("Hello, world!\n");中的"Hello, world!\n"这个字符串常量的! expand_call () 函数中的相关代码: if (args[i].reg == 0 && TYPE_SIZE (TREE_TYPE (args[i].tree_value)) != 0) { fprintf(stderr,

gcc源代码分析,finish_decl ()函数和push_parm_decl ()函数分析

parms: parm { push_parm_decl ($1); } /* This is what appears inside the parens in a function declarator. Is value is represented in the format that grokdeclarator expects.  */ parmlist_2:  /* empty */ { $$ = get_parm_info (0); } | parms { $$ = get_pa