symbian杂文

来源:互联网 发布:js写酷炫的界面 编辑:程序博客网 时间:2024/06/05 09:46
carbide 使用
2010-09-03 15:56

carbide 打包sis前 先要加入 pkg

项目右键 -> properties -> carbide.c++ -> carbide build configuration -> sis builder -> add 在SIS Properties面板的PKG File添加 pkg文件

ctr + h 全工程搜索

收集ing carbide的快捷方式。。。。

http://blog.csdn.net/hejianhua/archive/2009/09/22/4579953.aspx

类别:默认分类 |评论(0) | 浏览(61 )
 
Symbian 系统时间的获取和转换
2010-09-02 09:44

1.系统时间的获取
TTime currentTime;

currentTime.HomeTime(); //将time设置为本地时间(当前设定时区的时间,也就是手机显示的时间)

currentTime.UniversalTime(); //将time设置为标准时间(例如当前设置时区为北京(与标准时间差八小时),则获取的时 间与手机当前时间差八个小时)

2.时间格式是否与用户设置相关

相关:

手机用户可以设置时间显示模式 例如:年/月/日 月/日/年 日/月/年

currentTime.FormatL(time,_L("%Y%M%D%/0%1%/1%2%/2%3%/3")); //2007/08/13

如上所示的时间获取 其中 %1代表第一个项 例如 年/月/日时代表获取的是“年” 而“月/日/年”则代表获取的
是“月”,类推 %2获取的是第二项 %3获取的是第三项

无关:

currentTime.FormatL(timeBuf,_L("%F%Y/%M/%D,%H:%T:%S")); //将系统时间格式化为 2008/08/16,21:22:22

如上所示 %F代表获取的时间为标准 年月日格式 与系统设置无关

以下为详解:

详解:

格式串分为本地相关和本地无关格式串,也就是说和系统的时间日期中设置的格式是否相关。

以下所有格式字符都要加%

本地无关:

%:因为%是参数字符,所以需要输出%的时候,要用两个连续的%%进行转义

*:加在%后,表示需要缩写,比如%*T表示对分钟进行缩写,如果不是两位数,则去掉前导0

C:6位的微秒,%C默认是6位的,%*C2表示只取前两位,%*C4则取前4位

S:2位的秒,加*去掉前导0

T:2位的分,加*去掉前导0

H:24小时制的时,加*去掉前导0

I:12小时制的时,加不加*都会去掉前导0

F:%F参数表示D/M/Y三个参数都是本地无关的,按照格式串原样输出,%F需要用在%D、%M、%Y之前

D:2位的日,加*去掉前导0

M:2位的月,加*去掉前导0

Y:4位的年,加*去掉前两个数字,比如2008只显示08

E:星期,英文环境下,Sunday~Saturday,加*显示缩写,Sun~Sat;中文环境下,星期一~星期日,加*显示缩写,一~日

N:月的名称,英文环境下,January~December,加*显示缩写,Jan~Dec;中文环境下,1月~12月,加*显示缩写,阿拉伯数字

1~12。注意1月~12月数字都是阿拉伯数字,而不是汉字一~十二

W:2位数字,当前日期处于一年中的第几周,加*去掉前导0

X:日期后缀。例如%*D%X显示形如3rd(三号),%D%X显示形如02nd(二号)

Z:3位数字,当前日期处于一年中的第几天,加*去掉前导0

本地相关:

.:(点号)%.默认是小数点,表示分隔秒与毫秒之间的字符。可以通过TLocale::SetDecimalSeparator()设定。

::(冒号)%:表示获取本地设置中的时间分隔符,紧跟一个0~3范围的数字来指定哪一个日期分隔符。

类别:默认分类 |评论(0) | 浏览(343 )
 
安装完自动启动
2010-04-29 16:33

s60 3rd

//放到最后一行

"C:\Symbian\9.1\S60_3rd_MR\epoc32\release\gcce\urel\NewsReader.exe"                 -"!:\sys\bin\NewsReader.exe",FR,RI

s60 2rd

"\epoc32\release\armv5\urel\zoom.exe"-"!:\sys\bin\zoom.exe", FILERUN, RUNINSTALL

类别:默认分类 |评论(0) | 浏览(38 )
 
http请求之post请求2 不同协议
2010-04-29 16:29

void CHttpEngine::DoHTTPPostL()
{
//说明已经开始了HTTP请求,所以应该将状态置空
iEngineState = EIdle;
iNextProcessState = EIdle;

// Parse string to URI
TUriParser8 uri;
uri.Parse(*iUri);

// Get request method string for HTTP POST
RStringF method = iSession.StringPool().StringF(HTTP::EPOST,
    RHTTPSession::GetTable());

// Open transaction with previous method and parsed uri. This class will
// receive transaction events in MHFRunL and MHFRunError.
iTransaction = iSession.OpenTransactionL(uri, *this, method);

// Set headers for request; user agent, accepted content type and body's
// content type.
RHTTPHeaders hdr = iTransaction.Request().GetHeaderCollection();
SetHeaderL(hdr, HTTP::EUserAgent, KUserAgent);
SetHeaderL(hdr, HTTP::EAccept, KAccept);
SetHeaderL(hdr, HTTP::EContentType, KPostContentType);

// Set this class as an data supplier. Inherited MHTTPDataSupplier methods
// are called when framework needs to send body data.
//MHTTPDataSupplier* dataSupplier = this;
iTransaction.Request().SetBody(*iFormEncoder);

// Submit the transaction. After this the framework will give transaction
// events via MHFRunL and MHFRunError.
iTransaction.SubmitL();

iRunning = ETrue;

//启动定时器
if(NULL != iMoTimer)
   {
   iMoTimer->StartAfter(delayTime);
   }

//通知调用者,http请求已经开始
if(NULL != iObserver)
   {
   iObserver->HttpEvent(isAuto, EHttpStart);
   }
}

类别:默认分类 |评论(0) | 浏览(49 )
 
http请求之post请求
2010-04-29 16:28

// CONSTANTS
const TInt KMaxHeaderNameLength     = 32;
const TInt KMaxHeaderValueLength    = 128;
const TInt KMaxAuthTypeLength       = 128;
const TInt KMaxDateTimeStringLength = 40;
const TInt KMaxStatusTextLength     = 32;

// Used user agent for requests
_LIT8( KUserAgent, "HTTP 1.0" );
_LIT8( KUserAgentPost, "HTTP 1.1" );

// This client accepts all content types.
// (change to e.g. "text/plain" for plain text only)
_LIT8( KAccept, "*/*" );
_LIT8( KAdvice, "msg"); //Http Form format
_LIT8( KAdvice2, ""); //Http Form format
_LIT8(KPostContentType, "application/x-www-form-urlencoded");
_LIT8(KPostContentTypePost, "text/xml");

// Format for output of data/time values
_LIT( KDateFormat,"%D%M%Y%/0%1%/1%2%/2%3%/3 %:0%H%:1%T%:2%S.%C%:3" );

// Some texts for header output
_LIT( KColon, ": " );
_LIT( Krealm, "Realm: " );
_LIT8( KRange, "bytes=");

//继承与 public MHTTPDataSupplier
void CHTTPEngine::IssueHTTPPostL( const TDesC8& aUri )
{
//首先释放数据
if(NULL != iFormEncoder)
{
   delete iFormEncoder;
   iFormEncoder = NULL;
}
//创建数据
iFormEncoder = CHTTPFormEncoder::NewL();

_LIT8( KContent,"<config><client type=\"J2ME\" version=\"-1\" platform=\"JE2.0\"/><servers version=\"-1\"/><service-no version=\"-1\"/><parameters version=\"-1\"/><hints version=\"-1\"/><client-config version=\"-1\"/><http-applications version=\"-1\"/></config>" );
delete iPostData;
iPostData = 0;
iPostData = KContent().Alloc();
//从Unicode码转换为utf8编码,用于网络传输
//HBufC8 *vHbufc = CnvUtfConverter::ConvertFromUnicodeToUtf8L(KContent());
//iFormEncoder->AddFieldL(KAdvice2, KContent());
//delete vHbufc;
// add by hander in 2009-12-04
//Efalse
RLog::Log(_L("IssueHTTPPostL"));
iUpDataOver = EFalse;
TBuf<1024> uri16;
uri16.Copy(aUri);

// Parse string to URI (as defined in RFC2396)
TUriParser8 uri;
uri.Parse( aUri );

// Get request method string for HTTP POST
RStringF method = iSession.StringPool().StringF(HTTP::EPOST,
   RHTTPSession::GetTable());

// Open transaction with previous method and parsed uri. This class will
// receive transaction events in MHFRunL and MHFRunError.
iTransaction = iSession.OpenTransactionL(uri, *this, method);

// Set headers for request; user agent, accepted content type and body's
// content type.
RHTTPHeaders hdr = iTransaction.Request().GetHeaderCollection();
SetHeaderL(hdr, HTTP::EUserAgent, KUserAgentPost);
SetHeaderL(hdr, HTTP::EAccept, KAccept);
SetHeaderL(hdr, HTTP::EContentType, KPostContentTypePost);

// Set this class as an data supplier. Inherited MHTTPDataSupplier methods
// are called when framework needs to send body data.
MHTTPDataSupplier* dataSupplier = this;
iTransaction.Request().SetBody(*dataSupplier);

// Submit the transaction. After this the framework will give transaction
// events via MHFRunL and MHFRunError.
iTransaction.SubmitL();
iRunning = ETrue;
}

//实现以下几个虚函数
TBool CHTTPEngine::GetNextDataPart(TPtrC8& aDataPart)
{
if(iPostData)
{
   // Provide pointer to next chunk of data (return ETrue, if last chunk)
   // Usually only one chunk is needed, but sending big file could require
   // loading the file in small parts.
   aDataPart.Set(iPostData->Des());
}
return ETrue;
}

void CHTTPEngine::ReleaseData()
{
// It's safe to delete iPostData now.
delete iPostData;
iPostData = NULL;
}

TInt CHTTPEngine::OverallDataSize()
{
if(iPostData)
   return iPostData->Length();
else
   return KErrNotFound ;
}

TInt CHTTPEngine::Reset()
{
// Nothing needed since iPostData still exists and contains all the data.
// (If a file is used and read in small parts we should seek to beginning
// of file and provide the first chunk again in GetNextDataPart() )
return KErrNone;
}

HBufC8*             iPostData; // Data for HTTP POST

类别:默认分类 |评论(0) | 浏览(126 )
 
http请求之get请求
2010-04-29 16:25

// CONSTANTS
const TInt KMaxHeaderNameLength     = 32;
const TInt KMaxHeaderValueLength    = 128;
const TInt KMaxAuthTypeLength       = 128;
const TInt KMaxDateTimeStringLength = 40;
const TInt KMaxStatusTextLength     = 32;

// Used user agent for requests
_LIT8( KUserAgent, "HTTP 1.0" );
_LIT8( KUserAgentPost, "HTTP 1.1" );

// This client accepts all content types.
// (change to e.g. "text/plain" for plain text only)
_LIT8( KAccept, "*/*" );
_LIT8( KAdvice, "msg"); //Http Form format
_LIT8( KAdvice2, ""); //Http Form format
_LIT8(KPostContentType, "application/x-www-form-urlencoded");
_LIT8(KPostContentTypePost, "text/xml");

// Format for output of data/time values
_LIT( KDateFormat,"%D%M%Y%/0%1%/1%2%/2%3%/3 %:0%H%:1%T%:2%S.%C%:3" );

// Some texts for header output
_LIT( KColon, ": " );
_LIT( Krealm, "Realm: " );
_LIT8( KRange, "bytes=");

TBuf<1024> uri16;
uri16.Copy(aUri);

// Parse string to URI (as defined in RFC2396)
    TUriParser8 uri;
    uri.Parse( aUri );

    // Get request method string for HTTP GET
    RStringF method = iSession.StringPool().StringF( HTTP::EGET, RHTTPSession::GetTable());

    // Open transaction with previous method and parsed uri. This class will
    // receive transaction events in MHFRunL and MHFRunError.
    iTransaction = iSession.OpenTransactionL( uri, *this, method );

    // Set headers for request; user agent and accepted content type
RLog::Log(_L("SetHeaderL"));
    RHTTPHeaders hdr = iTransaction.Request().GetHeaderCollection();
    SetHeaderL( hdr, HTTP::EUserAgent, KUserAgent );
    SetHeaderL( hdr, HTTP::EAccept, KAccept );

//断点续传设置 //参数看具体协议

if (iDownLoadLenth != -1)
{
   TBuf8<32> RangeBuf(KRange);
   RangeBuf.AppendNum(iDownLoadLenth);
   RangeBuf.Append(_L8("-"));
   SetHeaderL( hdr, HTTP::ERange, RangeBuf );
   RLog::Log(_L("IssueHTTPGetL"),iDownLoadLenth);
}
    // Submit the transaction. After this the framework will give transaction
    // events via MHFRunL and MHFRunError.
    iTransaction.SubmitL();

类别:默认分类 |评论(0) | 浏览(75 )
 
总结一下对话框,最近用了这么几个 收藏下 方便下次找
2010-04-14 16:24

//全局对话框
CAknGlobalNote* pGlobalNote = CAknGlobalNote::NewLC();
pGlobalNote->SetSoftkeys(R_AVKON_SOFTKEYS_OK_EMPTY);
pGlobalNote->ShowNoteL(EAknGlobalWarningNote, _L("You have a incoming call."));
CleanupStack::PopAndDestroy(pGlobalNote);

//询问对话框
   TBuf<256> msg;
     CEikonEnv::Static()->ReadResource(msg, R_QTN_QTN_QUITORNO);
     CAknQueryDialog* dlg = CAknQueryDialog::NewL( );
     if ( dlg->ExecuteLD(R_AKNEXQUERY_CONFIRMATION_QUERY, msg))
     {
      AppUi()->Exit();
     }
     else
     {
      iContainer->DrawNow();
     }

滚动等待对话框-非全局
//资源
RESOURCE DIALOG r_gps_request_position_wait_note
    {
    flags = EAknWaitNoteFlags;// | EEikDialogFlagWait;
   
   // buttons = R_AVKON_SOFTKEYS_CANCEL;
    items =
        {
        DLG_LINE
            {
            type = EAknCtNote;
            id = ECidWaitNote;
            control = AVKON_NOTE
                {
                layout = EWaitLayout;
                singular_label = qtn_ld_net_updating; // its better to move this string into LOC file
                animation = R_QGN_GRAF_WAIT_BAR_ANIM;
                };
            }
        };
    }
{
if(iWaitDialog)
{       
   delete iWaitDialog;
   iWaitDialog = NULL;
}    
iWaitDialog = new(ELeave)CAknWaitDialog( (REINTERPRET_CAST(CEikDialog**,&iWaitDialog)));
iWaitDialog->SetCallback(this);

iWaitDialog->PrepareLC(R_GPS_REQUEST_POSITION_WAIT_NOTE);

// start it显示及等待
iWaitDialog->RunLD();
}
//结束等待框
{
if (iWaitDialog)
{
   iWaitDialog->ProcessFinishedL();
   iWaitDialog = NULL;
}
}

//显示及可修改内容对话框

//资源
RESOURCE DIALOG R_SAVE_DIALOG
    {
    flags = EGeneralQueryFlags;
    buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
    items=
        {
        DLG_LINE
            {
            type = EAknCtQuery;
            id = EGeneralQuery;
            control= AVKON_DATA_QUERY
                {
                layout = EDataLayout;
                control = EDWIN
                    {
                    flags= EEikEdwinNoHorizScrolling | EEikEdwinResizable;
                    maxlength = 250;
                    width = 4;
                    lines = 1;
                    };
                };
            }
        };
    }
void CMobilePaintAppUi::SaveAsL()
    {
    // Create path for filename
    TFileName path = PathInfo::PhoneMemoryRootPath();
    path.Append(PathInfo::ImagesPath());
   
    // Ask filename
    CAknTextQueryDialog* dlg = CAknTextQueryDialog::NewL(path,CAknQueryDialog::ENoTone);
    dlg->PrepareLC(R_SAVE_DIALOG);
    dlg->SetPromptL(_L("Save As"));
    if(dlg->RunLD())
        {
        //确定
        }
        else
        {
        //取消
        }
    }

类别:默认分类 |评论(0) | 浏览(187 )
 
在S60 3rd中,增大默认堆栈的大小
2010-03-18 09:31

在S60 3rd中,增大默认堆栈的大小

转自http://www.opda.net.cn/archiver/tid-3587.html

概叙

在S60第三版中,默认的堆栈大小为8k,它不能满足一些复杂的应用程序。

[b]详细描叙[/b]
随着Symbian 9的到来,由于平台安全,导致系统在允许程序时需要更多的内存,所以默认堆栈由原来的8K增加到了20K。

实际上,8K已经被证实在大一点的S60应用程序中是远远不够的。堆栈大小足够,程序可以正常运行,内存溢出将带来很大的风险,在S60 3rd的平台库中,有一个新的特点,它可以稍微的增加一点堆栈,因此,使用小的堆栈也将危害到二进制的兼容性。

在S60 3rd的SDK中,推荐为所有应用程序增加堆栈大小为20K。应用程序需要重新编译来改变堆栈大小。

最大的用户线程堆栈大小为:0x14000 ~80K
每个程序最大的堆栈大小为:0x200000 ~2MB.

[b]解决办法[/b]
改变堆栈大小不同于默认的8K,可以配置MMP文件中的epocstacksize申明:

CODE:
epocstacksize stacksize

堆栈的大小字节数,可以指定为十进制,或者十六进制格式。使用这个申明,在WINSCW/WINS平台下是看不出效果的。
例如:添加下面的一行到MMP文件中,将增加堆栈大小到20K:

CODE:
epocstacksize 0x5000

注:你也可以选择,在新线程创建时定义堆栈的大小。

在一台手机(或SDK的模拟器)上会有一定的物理内存大小,而你的应用程序将获取一部分做为堆内存使用。
当你程序启动后产生进程,会有一个预先分配的堆给其使用。S60第三版设备上缺省大小是4KB,早期的S60平台上是1KB。
根据需要,应用程序可以自由分配更多的堆内存,程序能使用的堆大小可在1M范围内动态增加,这是操作系统所规定最高极限了,呵呵。
如果试图分配的内存超过所能最大限制,将引发KErrNoMemory异常。
大部分Symbian C++程序在这样的堆内存安排下可以正常工作,但有时间我们需要更大的堆内存来工作。我们可以通过MMP文件中使用EPOCHEAPSIZE命令来指定最大和最小堆内存。
例如
TARGET MemoryTest.exe

TARGETTYPE exe

UID 0x00000000 KMemoryTestUID3

SECUREID KMemoryTestUID3

VENDORID 0x00000000

CAPABILITY NONE

EPOCHEAPSIZE 0x5000 0x400000

EPOCSTACKSIZE 0x5000

....
在上述代码中,应用程序描述了它所需要的最大和最小堆内存,分别是0x5000字节(20KB)和0x400000字节(4MB),现在该程序可以安全来分配一块3MB的堆空间。
Note: As documented, prior to S60 3rd Edition the EPOCHEAPSIZE statement has no effect on WINS32 platforms.

在上述代码中,应用程序描述了它所需要的最大和最小堆内存,分别是0×5000字节(20KB)和0×400000字节(4MB),现在该程序可以安全来分配一块3MB的堆空间。Note: As documented, prior to S60 3rd Edition the EPOCHEAPSIZE statement has no effect on WINS32 platforms.在对一张使用逐行编码的JPG图片进行解码时,会出现“内存不够”的错误

详细描述:
在对使用逐行编码的JPG图片进行解码时将比对使用顺序编码的JPG图片解码占用更多内存。
列如当使用CImageDecoder类对一张较大的逐行编码JPEG进行解码时,CImageDecoder::Convert()将会获得KErrNoMemory(-4)错误。
应用程序增加堆的大小将有助于这类问题的解决,我们可以在.mmp文件中使用EPOCHEAPSIZE命令进行调整,如:
EPOCHEAPSIZE 0×1000 0×200000
这样将初始化的堆大小从4KB(缺省)调整到2MB

解决方案:
我们可以通过在.mmp工程定义文件中使用epocstacksize命令行来修改缺省的8KB大小。
epocstacksize stacksize
堆栈的大小,可以通过十六进制或十进制来指定。但这对winscw/wins平台是无效的。
列如下面这行将堆栈大小增加到20KB
epocstacksize 0×5000
同样,我们也可以在产生新线程时定义该线程的堆栈大小。

S60第三版中最小缺省堆栈大小

说明:在S60第三版中缺省的堆栈大小只有8KB,这对大多数复杂程序来说是不够的

详细描述:
在symbian OS v9中缺省的堆栈大小从20kb缩减到8kb,以优化内存的消耗。这主要是因为平台安全性导致了在系统中同时运行的进程增多。
实际上,8kb的堆栈大小对任何一个稍大的S60程序来说都是不够的。如果在当前设备上缺省的堆栈能运行你的程序,那因为堆栈的溢出(平台库的消耗而引发堆栈的增长),它也很容易引发崩溃。在S60第三版SDK中建议所有程序都增长到20KB堆栈,这需要为此重新编译。

解决方案:
我们可以通过在.mmp工程定义文件中使用epocstacksize命令行来修改缺省的8KB大小。
epocstacksize stacksize
堆栈的大小,可以通过十六进制或十进制来指定。但这对winscw/wins平台是无效的。
列如下面这行将堆栈大小增加到20KB
epocstacksize 0×5000
同样,我们也可以在产生新线程时定义该线程的堆栈大小。

默认情况下,程序支持的堆最大是1M,申请超过1M会导致失败,从而造成内存泄漏.

怎样才能让你的程序可申请超过1M的内存,可通过以下的的示例方法实现:

GLDEF_C TInt E32Main()
{
     RHeap *heap = UserHeap::ChunkHeap( NULL, 1024 * 4, 1024 * 1024 * 2 );    // 2MB
     if( heap )
     {
         User::SwitchHeap( heap );
     }
     TInt ret = EikStart::RunApplication( NewApplication );
     if ( heap )
     {
      heap->Close();
     }
     return ret;
}

类别:默认分类 |评论(0) | 浏览(661 )
 
查找-CAknSearchField
2009-11-25 15:27

本文章转载自:http://blog.csdn.net/stonesl/archive/2008/06/17/2557599.aspx

个人觉得很好,留作备份,以备以后使用

CAknSingleStyleListBox* iListBox;

CAknSearchField* iListBoxSearchField;

//defined

CGulIcon* defaultIcon = NULL;

CAknSearchField* searchField =   CAknSearchField::NewL( *this, CAknSearchField::EFixed,defaultIcon, 40 );

CleanupStack::PushL ( searchField );

searchField->SetSkinEnabledL(ETrue);

CAknFilteredTextListBoxModel* filteredModel =   static_cast< CAknFilteredTextListBoxModel* >( iListBox->Model() );

filteredModel->CreateFilterL( iListBox, searchField );

searchField->Editor().SetAknEditorInputMode(EAknEditorTextInputMode);

CleanupStack::Pop( searchField );

searchField->MakeVisible( ETrue );

iListBoxSearchField = searchField; //in

//SizeChanged()

iListBox->SizeChanged();

AknFind::HandleFixedFindSizeChanged( this, ( CAknColumnListBox *)iListBox, iListBoxSearchField );//use HandleFixedFindSizeChanged

//OfferKeyEvent

if ( iListBoxSearchField != NULL && iListBoxSearchField->OfferKeyEventL( aKeyEvent, aType ) == WasConsumed )        

{        

return EKeyWasConsumed;       

}

下边两个不要忘了,要不然会改变不了输入法的(我就在这个地方折腾了一天,郁闷呀!)

TInt CContactContainer::CountComponentControls() const

{

return 2;

}

CCoeControl* CContactContainer::ComponentControl(TInt aIndex) const

{    

switch ( aIndex )        

{        

case 0:            

return iListBox;  

case 1:   

return iListBoxSearchField;        

default:            

return NULL;        

}

}

//取得指定项的操作

TInt CurrentItem = iListBox->View()->CurrentItemIndex ();  

CAknFilteredTextListBoxModel* Model = STATIC_CAST (CAknFilteredTextListBoxModel*, iListBox->Model ());

TInt index = Model->Filter()->FilteredItemIndex (CurrentItem);

if( index < 0 )     

  return NULL;  

CDesCArray *itemList = static_cast<CDesCArray*>( iListBox->Model()->ItemTextArray() );  

TPtrC ptrin=(*itemList)[index];

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/stonesl/archive/2008/06/17/2557599.aspx

类别:默认分类 |评论(0) | 浏览(111 )
 
pkg文件的一些高级选项
2009-11-25 13:21

写的很好,特意转过来,做一个备份。
以下博文转至Darren(博友):http://blog.csdn.net/xjtursh/archive/2008/08/05/2768902.aspx

关于pkg文件的一些高级选项....ZZ from wiki.forum.nokia.com 收藏
文字告示
在安装过程中你可以指定一个文件文件显示给用户。这个文件本身不会被拷贝到目标设备,用于显示基本的自述信息或许可协议。为此,添加下行到pkg文件:

"license.txt" - " ", FILETEXT, TEXTCONTINUEFILETEXT指出在安装期间显示该文件。TEXTCONTINUE会提供一个可以关闭这个文本文件的继续按钮然后继续安装。代替TEXTCONTINUE,你可以指定为下面之一:

• TEXTSKIP 显示一个是/否选项。 若选择是,安装继续。 若选择否,则跳过下一段说明,安装仍正常继续向前。

• TEXTEXIT 显示一个是/否选项。 若选择是,安装继续。若选择否, 安装停止并删除任何已安装文件。

• TEXTABORT 显示一个是/否选项。但当选择否时,安装只停止,不删除任何已安装文件。移除运行时生成的文件。


多语言文字告示
文字告示的语言能被自定义取决于设备的缺省语言。例如:

IF (LANGUAGE=2) ; 若语言是法语,则显示mytext.t02
   "mytext.t02"-"", FILETEXT, TEXTABORT
ELSEIF (LANGUAGE=3) ; 若语言是德语,则显示mytext.t03
   "mytext.t03"-"", FILETEXT, TEXTABORT
ELSE ; 否则显示mytext.t01
   "mytext.t01"-"", FILETEXT, TEXTABORT
ENDIF当设备上的缺省语言是法语时上例将显示mytext.t02;德语时mytext.t03;任何其它语言时mytext.t01。

顺便提及,你也必须在PKG中定义语言:

;Language - standard language definitions
&EN,GE,FR移除运行时生成的文件
当经由程序的sis文件卸载程序时,卸载程序会移除所有被安装程序按照pkg文件中的文件说明行拷贝到电话的那些文件。但在运行时生成的文件又该如何呢?

若应用程序创建的文件名在安装时已知,那么它们必须作为'空文件(null files)'添加到.pkg文件。在.pkg文件中的文件名(语言中立的文件)的格式如下:

"" - "C\system\data\my_runtime_generated_file", FILENULL这里的my_runtime_generated_file是一个由应用程序所创建的数据文件。FN(FILENULL)参数意思是文件尚不存在,因此它不包含在sis文件中。是由运行的应用程序创建的,在应用程序被移除时会被删除。注意: 所指定的源文件名不重要且应为空白("")。也注意: 当升级到一个后来的版本这些不会被删除。这确保了诸如.ini等文件,存储了应用程序偏好,在升级中不丢失。

FILENULL选项在Symbian OS v9.x中是不支持的。建议开发人员在他们的应用程序的数据笼(data cage)内创建文件,这里的文件在卸载时会被自动(及完全)删除。

若应用程序所建的文件数量(或它们的准确名称)未知,情形就稍微有些复杂了。作为一种解决方法,.sis包能包含一个特殊的卸载程序,负责在卸载时找到并移除恰当的文件。这样的一个程序可以在卸载时被自动运行,如下:

"\epoc32\release\armi\urel\uninst.app" - "!:\system\apps\myapp\uninst.app", RR, RWRR (RUNREMOVE)参数在移除(卸载)时要运行的文件。RW (RUNWAITEND)指明(系统)移除工具应启动这个程序然后等待,直到继续安装之前运行完。

嵌入SIS文件
能在你的sis文件包含另一个sis文件,如下面的代码:

@”sis file name”,(UID)例如: @”prog1.sis”,(0x12341234) prog1.sis,具有UID 0x12341234,在碰到这行时安装。注意: 在卸载时,这个嵌入的sis直到系统判断出没有其他当前已安装部件使用它(也就是,没有其他已安装部件在其pkg文件也包括该sis)才会被卸载。

在安装或卸载时运行可执行文件
你能指定要运行的可执行文件,通过在可执行文件描述行尾部添加FILERUN (FR)和RUNINSTALL (RI)关键字。

例如:

"\Symbian\6.1\Series60\Epoc32\release\armi\urel\myprogram.exe"-
"!:system\programs\myprogram.exe",FR,RI将安装myprogram.exe并在安装期间执行。RUNINSTALL关键字可用下面的任何一个替代:

• RUNREMOVE (RR) 使得只在卸载期间才执行。

• RUNREMOVE (RR) 使得可执行文件在安装和卸载期间都执行。

这三个选项中任一个可进一步与关键字 RUNWAITEND (RW)配合使用,RUNWAITEND (RW)使得安装等到执行结束方可继续。若未指定,那么安装将在可执行文件启动后马上继续。

依赖行(Requisite Lines)
你可以用依赖行指出一个特定的部件必须已经安装当前的安装方能继续。使用下面的格式:

{UID}, Major_Version_#,Minor_Version_#,Build_#,{“Product Name”}这意味着具有指定的UID和产品名、且不早于所指定版本号的部件必须存在安装才能继续。

例如:

{0x10000123},1,0,0,{"MyDll"}指出一个叫MyDll的部件,具有UID 0x10000123和至少是1.0.0的版本号,必须在安装能继续前已经存在。依赖行应该看上去比较熟悉——因为这也是目标平台行的实现方式。目标平台行例子:

(0x101F6F88), 0, 0, 0, {"Series60ProductID"}是一个必要的声明: 名称为Series60ProductID的部件,其UID为0x101F6F88、版本号0.0.0或更高,必须存在安装方能继续。

从S60第三版开始,S60产品Id必须写在方括弧中。例子:

[0x101F7961], 0, 0, 0, {"S60ProductID"}


语言支持
应用程序的多个翻译版本可存在于单个sis文件中。当用户安装sis文件时,他们被提示选择要安装哪一种语言。为指定你想包含的多种语言,需在pkg文件顶部添加语言行。语言行以‘&’开始,含有来自下面列表(不完整)的逗号分割的语言码清单:

AM– US English
AS – Austrian German
AU – Australian English
BF – Belgian French
BL – Belgian Flemish
CS – Czech
DA – Danish
DU – Dutch
EN – UK English
FI – Finnish
FR – French
GE – German
HK – Hong Kong Chinese
HU – Hungarian
IC – Icelandic
IF – International French
IT – Italian
JA – Japanese
NO – Norwegian
NZ – New Zealand
PL – Polish
PO – Portuguese
RO - Romanian
RU – Russian
SF – Swiss French
SG – Swiss German
SK – Slovak
SL – Slovenian
SP – Spanish
SW – Swedish
TC – Taiwan Chinese
TH – Thai
TU – Turkish
ZH – Prc Chinese
一个语言行例子:

&EN, FR, FI它指出此sis文件含有英语、法语和芬兰语语言选择。若不含有语言行,则认为是&EN。

限制支持的设备
限制包文件只安装到某些设备是可能的。例如,使用WiFi的应用程序应只在有WiFi的设备上才是可安装的。若包文件被装到无WiFi设备,安装程序会显示一个警告信息: 此应用程序不兼容。

下例演示了一个包文件例子,只能安装到Nokia N80, N93, N93 和 N95:

[0x200005F9], 0, 0, 0, {"Nokia N80 ID"}
[0x20000600], 0, 0, 0, {"Nokia N93 ID"}
[0x20000605], 0, 0, 0, {"Nokia N93i ID"}
[0x2000060B], 0, 0, 0, {"Nokia N95 ID"}设备Id列表可在S60 Platform and device identification codes中找到。

安装设备相关文件
安装依赖于用户设备的文件是可能的。例如,游戏开发人员可以为支持3D加速器的设备创建一个特殊的DLL。对于无3D加速器设备,包文件应安装标准DLL。这个可用下面的代码来完成:

IF (MachineUID=0x20000600) OR (MachineUID=0x2000060B)

; If the device is Nokia N93 or N95, then install files in this block.
"\epoc32\release\armv5\urel\mydll_3d" -"!:\sys\bin\mydll.dll"

ELSE

; Otherwise install any files in this block.
"\epoc32\release\armv5\urel\mydll" -"!:\sys\bin\mydll.dll"

ENDIF设备Id列表可在S60 Platform and device identification codes中找到。


安装平台相关文件
安装依赖于操作系统的文件是可能的。例如,3rd FP2版去掉了一些Bluetooth库,因此必须安装不同的文件。通过检查z:\system\install文件夹内的文件可获得电话的平台:

if exists("z:\system\install\Series60v3.2.sis")
"\Epoc32\release\gcce\UREL\Common_0x123123123_fp2.dll"-"C:\sys\bin\common_0x123123123.dll"
else
"\Epoc32\release\gcce\UREL\Common_0x123123123.dll"-"C:\sys\bin\common_0x123123123.dll"
endif

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xjtursh/archive/2008/08/05/2768902.aspx

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/taoshuai567/archive/2009/11/06/4777597.aspx

类别:默认分类 |评论(0) | 浏览(145 )
原创粉丝点击