|
这篇文章详细解读了 S60 的 Hello Carbide 例子程序,通过这个,我们能了解到很多 Symbian 开发的知识。 Environment: Windows XP SP2, S60 SDK 3rd MR, Carbide.C++ V1.1 关入如何建立 hello carbide example, 请参阅《S60 Development, Getting Started, HelloCarbide example》 当我们完全建立起来这个 Hello Carbide example 程序的时候,Framework 一共为我们建立了以下的 Class: 1,CHelloCarbideApplication 一个 Application 的应用程序类,从 CAknApplication 继承出来, 2,CHelloCarbideDocument 这个是文档类,专门用来存储应用程序的数据的 3,CHelloCarbideAppUi 应用程序的 UI 类 4,CHelloCarbideAppView 应用程序的 View 类 执行流程 应用程序的入口,在 HelloCarbide.cpp 这个文件中, 整个程序的入口,Symbian 程序的入口函数名叫 E32Main,不是普通 PC 开发中的 main() EikStart 这个 class 是专门用来初始化和启动应用程序的,RunApplication 函数的参数是一个工厂方法,在这里就是 NewApplication LOCAL_C CApaApplication* NewApplication() { return new CHelloCarbideApplication(); } GLDEF_C TInt E32Main() { return EikStart::RunApplication( NewApplication ); } 程序的执行流程就从这里开始,在 NewApplication 方法中 new 了一个 CHelloCarbideApplication class 的 Object, 然后 S60 Framework 会调用 CHelloCarbideApplication::CreateDocumentL() 方法来创建一个文档对象, CApaDocument* CHelloCarbideApplication::CreateDocumentL() { return (static_cast<CApaDocument*>( CHelloCarbideDocument::NewL( *this ) ) ); } 我们看到,在这个方法中,调用了 CHelloCarbideDocument class 的 static 函数 NewL. 在这里的 NewL 和 NewLC 方法就是典型的 Symbian 的 Clean Stack 的用法, Clean Stack 是 Symbian 中非常重要的概念,一定要搞明白, 请读下面这个文档,它非常清楚的说明了 Clean Stack 的用法,在结合这一段代码,就能很好理解了。 CHelloCarbideDocument* CHelloCarbideDocument::NewL( CEikApplication& aApp ) { CHelloCarbideDocument* self = NewLC( aApp ); CleanupStack::Pop( self ); return self; } CHelloCarbideDocument* CHelloCarbideDocument::NewLC( CEikApplication& aApp ) { CHelloCarbideDocument* self = new ( ELeave ) CHelloCarbideDocument( aApp ); CleanupStack::PushL( self ); self->ConstructL(); return self; } 再继续,S60 framework 会调用 下面整个函数来创建 UI 对象 CEikAppUi* CHelloCarbideDocument::CreateAppUiL() { return ( static_cast <CEikAppUi*> ( new ( ELeave ) CHelloCarbideAppUi ) ); } void CHelloCarbideAppUi::ConstructL() { // Initialise app UI with standard value. BaseConstructL(); // Create view object iAppView = CHelloCarbideAppView::NewL( ClientRect() ); } 在这里又会去调用 CHelloCarbideAppView::NewL 来创建 View 对象,这个 NewL 方法和 CHelloCarbideDocument::NewL 原理是完全一样的,这里就不多说了。 至此,Hello World 程序的初始化过程完毕。 关于调试 你最好能自己单步跟踪调试一下程序,就能很清楚的看到整个程序的执行流程,对你理解 Symbian 程序有非常打的帮助。 在 Editor View 中,共有下面三种方法可以设置断点, * Double-click the marker bar to the left of the line of code where you want to place a breakpoint * Right-click in the marker bar and select Toggle Breakpoint * Click on the line of code and select Run > Toggle Breakpoint from the program menu bar 然后,主菜单 Run > Debug As > Debug Symbian OS Application,就可以开始调试。 在调试的过程中有四个按键需要了解, F5,Step Into F6,Step Next F7,Step Return F8,Resume 在这里,设计到了 S60 的 framework,关于 Framework 的详细信息,请阅读下面这份文档,在阅读的过程中,结合 Hello World 程序,你就能加深在 Symbian 程序的理解。 |