关于3rd程序启动是参数的小结
在Symbian 3rd手机上对于GUI程序的启动方式可以采用安装时自启动、开机自启动、编码启动和点击功能表图标的方式启动,有很多软件往往对采用何种方式启动需要做些前后台以及其它相关的处理方式,那么如何识别目前的GUI程序是何种启动呢?
方法就是通过重载GUI框架的C*AppUi:: ProcessCommandParametersL (CApaCommandLine &aCommandLine)函数(该函数还有其它重名函数,这里只对最简单的形式进行解析,抛砖引玉),对其入参进行识别来判断是何种形式的自启动。下面对我试验中的几种情况给出示例,方便以后查询。
1、安装时启动,即pkg中标记为FR,RI标记的启动方式
在C*AppUi::ProcessCommandParametersL中入参的
aCommandLine.OpaqueData().Length()为0
2、通过Startup List开机自启动的方式
结果参数与1同
3、通过点击程序图片启动
在C*AppUi::ProcessCommandParametersL中入参的
aCommandLine.OpaqueData().Length()为1,具体符号,搞不出来,反正是ASCII码值为1的那个符号
4、代码编程启动
试过三种方式:
第一种
const TUid KAppUid={0x2CC2D30E};
TThreadId app_threadid;
RApaLsSession ls;
User::LeaveIfError(ls.Connect());
TInt err=ls.StartDocument(KNullDesC, KAppUid, app_threadid);
ls.Close();
结果同3
第二种
RApaLsSession apaLsSession;
User::LeaveIfError(apaLsSession.Connect());
CleanupClosePushL(apaLsSession);
TApaAppInfo appInfo;
TInt retVal = apaLsSession.GetAppInfo(appInfo, aAppUid);
if (retVal == KErrNone)
{
CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
cmdLine->SetCommandL(EApaCommandRun);
cmdLine->SetExecutableNameL(appInfo.iFullName);
_LIT8(KExitDesC,"start");
cmdLine->SetOpaqueDataL(KExitDesC);
User::LeaveIfError(apaLsSession.StartApp(*cmdLine));
CleanupStack::PopAndDestroy(cmdLine);
}
else
{
// The application not found!
}
CleanupStack::PopAndDestroy(&apaLsSession);
结果还是同3
第三种
_LIT8(KExitDesC,"start");
CApaCommandLine *cmd=CApaCommandLine::NewLC();
cmd->SetCommandL(EApaCommandRun);
cmd->SetExecutableNameL(_L("start.exe"));
cmd->SetOpaqueDataL(KExitDesC);
RApaLsSession als;
User::LeaveIfError(als.Connect());
CleanupClosePushL(als);
User::LeaveIfError(als.StartApp(*cmd));
CleanupStack::PopAndDestroy(2);
结果与上述就不一样了,aCommandLine.OpaqueData()内容就是"start",也即五位描述符长度的内容。对于第二种和第三种情况,我是百思不得其解,为什么传执行文件名就可以,而传完整路径就是不行。
好了,暂时小结到这里。好久没更新空间,今天就上来码几个字。