Symbian之源码分析之EikEnv.cpp
2010-07-04 15:42:00 来源:WEB开发网这篇着重讲下里面CEikonEnv相关的几句:
CEikonEnv* env = new CEikonEnv;
TRAP(error, env->ConstructAppFromCommandLineL(aApplicationFactory, *commandLine));
env->Execute();
env->DestroyEnvironment();
一、创建CEikonEnv实例
CEikonEnv的默认构造函数实现为空,但是其基类CCoeEnv的构造函数做了些事情:
CCoeEnv::CCoeEnv() : CActive(EActivePriorityWsEvents)
{
TInt error=KErrNone;
//conenv已经存在时抛cone 2异常
__ASSERT_ALWAYS(!TheCoe(),Panic(ECoePanicEnvironmentAlreadyExists));
//设置当前conenv
if (error==KErrNone)
error=SetTheCoe(this);
//初始化清理栈,注意用的是New()而不是NewL()
iCleanup=CTrapCleanup::New();
if ((iCleanup==NULL) && (error==KErrNone))
error=KErrNoMemory;
//不能在这里抛异常,否则iCleanup对象所分配的内存将永远无法收回。
//所以在这里需要一个标记,在CCoeEnv::ConstructL里会处理。
if (error!=KErrNone)
{
iExtra=REINTERPRET_CAST(CCoeEnvExtra*, error);
iEnvFlags|=EExtraPointerIsErrorCode;
}
}
二、创建应用程序
这部分代码比较多,本篇先说到调用CEikonEnv::ConstructL()为止。
CEikonEnv::ConstructAppFromCommandLineL(const TApaApplicationFactory& aApplicationFactory,const CApaCommandLine& aCommandLine)
{
// Construct iEikEnvExtra here so that the app language can be stored in it
if (!iEikEnvExtra)
iEikEnvExtra = CEikEnvExtra::NewL(*this);
//连接AppArc server
RApaLsSession apparcServer;
CleanupClosePushL(apparcServer);
TInt err = apparcServer.Connect();
//保存程序Language到iEikEnvExtra->iAppLanguage及baflutils里
StoreAppLanguageL(apparcServer);
//设置默认screen
if (aCommandLine.IsDefaultScreenSet()) //如果命令行参数有设置过
更多精彩
赞助商链接