`
hagensas
  • 浏览: 12628 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

如何实现手机中应用程序的开机自启动,附源代码

阅读更多
根据以往Symbian设计的经验,Recognizer将被用来识别与文件绑定的MIME类型。这是用来处理特殊类型数据的步骤之一。相关知识可以参考Nokia那篇著名的《guide for application developer on document handler》文档,在symbian sdk安装目录下面的Series60Doc目录下面可以找到他。
         Recognizer也能够用来实现应用程序的开机自启动,当然这不是Recognizer的本意。但是,很危险的是,如果recognizer出了问题,手机将无法正常启动,而且你必须要重新到当地的Nokia客服部门重新刷机。
        下面的代码是用于EZBoot应用的,这些代码本身有很好的说明,所以我不再详细解释。
        注意,出现在头文件和mmp文件中的0x101Fxxxx这个值需要用你自己项目的UID替换。

头文件源码:

//////////////////////////////////////////////////////////////////////////////
//

//                             EZ-Boot
//                         

//////////////////////////////////////////////////////////////////////////////
//
                       Boot & Recognizer Module
//                    by NewLC (http://www.newlc.com)

//////////////////////////////////////////////////////////////////////////////
//
 File         : ezrecog.h
//
 Compatibility: Symbian OS v6.1
//
 History:
//
   2003.07.26: EBS : Creation
//
   2003.08.12: EBS : Integration in EZBoot
//
   2003.09.01: EBS : Add boot file recognition
//   2003.10.28: EBS : Cleanup and comment

//////////////////////////////////////////////////////////////////////////////

#include 
<apmrec.h> // CApaDataREcognizerType

#define KUidRecog 0x1xxxxxxx // Use your own value here !!!

class CRecog : public CApaDataRecognizerType
{
public

        CRecog();
        TUint PreferredBufSize();
        TDataType SupportedDataTypeL(TInt aIndex) 
const
;
        
static void
 BootUp();
        
static TInt BootUpKick(TAny *
aParam);
        
static void
 BootUpKickL();
        
private
:
        
void DoRecognizeL(const TDesC& aName, const TDesC8&
 aBuffer);
        TBool HeaderRecognized(
const TDesC8&
 aBuf);
        TBool NameRecognized(
const TDesC&
 aName);
};

 

实现的源代码:

//////////////////////////////////////////////////////////////////////////////
//
//                             EZ-Boot
//                         
//////////////////////////////////////////////////////////////////////////////
//                      Boot & Recognizer Module
//                    by NewLC (http://www.newlc.com)
//////////////////////////////////////////////////////////////////////////////
// File         : ezrecog.cpp
// Compatibility: Symbian OS v6.1
// History:
//   2003.07.26: EBS : Creation
//   2003.08.12: EBS : Integration in EZBoot
//   2003.09.01: EBS : Add boot file recognition
//   2003.10.28: EBS : Cleanup and comment
//////////////////////////////////////////////////////////////////////////////

#include 
<e32std.h>
#include 
<e32base.h>
#include 
<e32def.h>
#include 
<f32file.h>
#include 
<apacmdln.h>
#include 
<apgcli.h>
#include 
<apmrec.h> 
#include 
<apmstd.h>
#include 
"ezrecog.h"

//////////////////////////////////////////////////////////////////////////////
//
// Recognition Definitions
//
/////////////////////////////////////////////////////////////////////////////

// The MIME Type that will be recognized
_LIT8(KEzbMimeType,"text/vnd.newlc.ezboot");

// The file extension that shall be used by data we are recognizing
_LIT(KEzbFileExtension,".boot");
 
// The data header that identifies EZBoot data
_LIT8(KEzbDataHeader,"EZBoot:");

// The priority of the recognizer, can be EHigh, ENormal, ELow
#define KEzRecognizerPriority CApaDataRecognizerType::ENormal

// The size of the data buffer that will be passed to the recognizer
// so that it performs the recognition
#define KEzRecognizerBufferSize 7

// The recognizer UID
const TUid KUidEzBoot={KUidRecog};


//////////////////////////////////////////////////////////////////////////////
//
// Boot Definitions
//
/////////////////////////////////////////////////////////////////////////////

// The application we want to boot (here the EZBoot server)
_LIT(KEzBootExe,"\\system\\programs\\ezboot\\ezbootsrv.exe");

// The thread name that will used to launch the above EXE
_LIT(KBootUpThreadName,"EzBootThr");

//////////////////////////////////////////////////////////////////////////////
/// DLL entry point.
/// \param aReason can be ignored.
/// \return Always KErrNone
/////////////////////////////////////////////////////////////////////////////
GLDEF_C TInt E32Dll(TDllReason /*aReason*/)
{
   
return(KErrNone);
}

//////////////////////////////////////////////////////////////////////////////
/// Recognizer instanciation. This function MUST be the first one defined 
/// for the recognizer.
/// \return a pointer on a new allocated recognizer instance
//////////////////////////////////////////////////////////////////////////////
EXPORT_C CApaDataRecognizerType *CreateRecognizer()
{
   
// Create a recognizer instance
   CApaDataRecognizerType *me = new CRecog();
   
   
// Start all the boot code under a trap harness
   
// This is pure boot code and has (normally) nothing to do 
   
// in a recognizer
   CRecog::BootUp();
   
   
return(me);
}

//////////////////////////////////////////////////////////////////////////////
/// Recognizer Constructor. 
/// Initialise the internal data member iCountDataTypes with the number of 
/// MIME types that will be recognized. Set the recognizer priority.
//////////////////////////////////////////////////////////////////////////////        
CRecog::CRecog()
:CApaDataRecognizerType(KUidEzBoot,KEzRecognizerPriority)
{
        iCountDataTypes
=1;
}

//////////////////////////////////////////////////////////////////////////////
/// Returns the size of the data buffer that will be passed to the recognition
/// function (used by the recognition framework)
/// \see DoRecognizeL()
/// \return size of the data buffer
//////////////////////////////////////////////////////////////////////////////        
TUint CRecog::PreferredBufSize()
{
   
return(KEzRecognizerBufferSize);
}

//////////////////////////////////////////////////////////////////////////////
/// Returns the MIME type that our recognizer is able to manage
/// (used by the recognition framework)
/// \param aIndex: the index of the MIME type to return (will be always 1 for
///                a recognizer that handles a single MIME type)
/// \return a MIME type
//////////////////////////////////////////////////////////////////////////////
TDataType CRecog::SupportedDataTypeL(TInt /*aIndex*/const
{
   
return(TDataType(KEzbMimeType));
}

/////////////////////////////////////////////////////////////////////////////
/// The recognition function. The result of the recognition is stored in 
/// the iConfidence data member.
/// \param aName:   the name of the file that contain the data to analyze
/// \param aBuffer: the data buffer
/// \see PreferredBufSize()
/////////////////////////////////////////////////////////////////////////////
void CRecog::DoRecognizeL(const TDesC& aName, const TDesC8& aBuffer)
{
   
// Initialise the result status
   iConfidence = ENotRecognized;
   iDataType   
= TDataType(KEzbMimeType);
   
   
// Check that we got the required amount of data
   if(aBuffer.Length()<KEzRecognizerBufferSize)
           
return;

   
// Check that the file name corresponds to our criteria
   TBool nameOK(EFalse);
   nameOK
=NameRecognized(aName);
   
   
// Check that the data corresponds to our criteria
   TBool headerOK(EFalse);
   headerOK
=HeaderRecognized(aBuffer);            
   
   
// Conclude: 
   
// - if file name and data are OK then the data are certainly recognized
   
// - if only the data are recognized, then this is only a possibility
   
// - else the data have not been recognized
   if( nameOK && headerOK)
   {
           iConfidence
=ECertain;
   }
   
else if(!nameOK && headerOK)
   {
           iConfidence
=EPossible;
   }
   
else
           
return;
}

/////////////////////////////////////////////////////////////////////////////
/// The file name recognition function. This functions checks whether the 
/// provided filename matches our criteria (here we want it to have the .boot
/// extension)
/// \param aName: the name to check
/// \return ETrue if the file is OK
/////////////////////////////////////////////////////////////////////////////
TBool CRecog::NameRecognized(const TDesC& aName)

  TBool res
=EFalse;
  
if(aName.Length()>5)
  {
     TInt dotPos 
= aName.LocateReverse( '.' );
     
if (dotPos != KErrNotFound)
     {
        TInt extLength 
= aName.Length() - dotPos;
        HBufC
* ext = aName.Right( extLength ).AllocL();
        CleanupStack::PushL( ext );
        
if ( ext->CompareF(KEzbFileExtension) == 0 )
        {
          res 
= ETrue;
        }
        CleanupStack::PopAndDestroy(); 
// ext
     }
   }
   
return(res);
}

/////////////////////////////////////////////////////////////////////////////
/// The data recognition function. This functions checks whether the 
/// provided data starts with our data header
/// extension
/// \param aBuf: the data buffer to check
/// \return ETrue if the data are OK
/////////////////////////////////////////////////////////////////////////////
TBool CRecog::HeaderRecognized(const TDesC8& aBuf)

   
if(aBuf.Find(KEzbDataHeader)==0)
        
return ETrue;
   
return EFalse;
}


/////////////////////////////////////////////////////////////////////////////
/// The Boot code (non leaving). Create a new thread and kicks the real
/// boot code. 
/// \see BootUpKick()
/////////////////////////////////////////////////////////////////////////////
void CRecog::BootUp()
{
   
// Create a new thread
   RThread* bootThread = new RThread();
   
if(bootThread)
   {
       TInt res
=KErrNone;
       
       
// and Start it
       res=bootThread->Create(KBootUpThreadName,
                              CRecog::BootUpKick,
                              KDefaultStackSize,
                              KMinHeapSize,
                              KMinHeapSize,
                              NULL,
                              EOwnerThread);
       
       
if(res==KErrNone)
       {
           bootThread
->Resume();
           bootThread
->Close();
       }
       
else
       {
           delete bootThread;
       }
   }
}

/////////////////////////////////////////////////////////////////////////////
/// The threaded boot code (non leaving). Actually just create a cleanup
/// stack and call a non-leaving implementation of the boot code
/// \see BootUp()
/// \see BootUpKickL()
/// \param aParam: not used but required as a thread entry point
/// \return thread result
/////////////////////////////////////////////////////////////////////////////
TInt CRecog::BootUpKick(TAny* /*aParam*/)
{
   TInt err
=KErrNoMemory;
       
// Create a cleanup stack
   CTrapCleanup *cleanup=CTrapCleanup::New();
   
if(cleanup)
   {
       
// and Kick under a trap harness
       TRAP(err,CRecog::BootUpKickL());
       delete cleanup;
   }
   
return err;
}

/////////////////////////////////////////////////////////////////////////////
/// The Boot code. 
/////////////////////////////////////////////////////////////////////////////
void CRecog::BootUpKickL()
{
        
// Get the full path (including drive letter)
        
// to the boot server
        RFs fs;
        User::LeaveIfError(fs.Connect());
        CleanupClosePushL(fs);
        TFindFile findFile(fs);
        User::LeaveIfError(findFile.FindByDir(KEzBootExe,KNullDesC));

        
// Connect to the Apparc server
        
// and start our server
        RApaLsSession ls;
        User::LeaveIfError(ls.Connect());
        CleanupClosePushL(ls);
        CApaCommandLine 
*cmd = CApaCommandLine::NewLC();
        cmd
->SetLibraryNameL(findFile.File());
        cmd
->SetCommandL(EApaCommandOpen);
        User::LeaveIfError(ls.StartApp(
*cmd));

        
// Delete all stuff on the cleanup stack
        CleanupStack::PopAndDestroy(3);
}

MMP文件的源代码:
TARGET      ezrecog.mdl
TARGETTYPE  mdl
TARGETPATH  \system\recogs

UID         
0x10003A19 0x101Fxxxx 

USERINCLUDE   ..\inc
SYSTEMINCLUDE \epoc32\include

SOURCEPATH    ..\src
SOURCE        ezrecog.cpp

LIBRARY       euser.lib 
LIBRARY       apmime.lib apparc.lib apgrfx.lib
LIBRARY       efsrv.lib
分享到:
评论

相关推荐

    MFC设置开机自动启动源代码

    本示例中的“MFC设置开机自动启动源代码”涉及如何利用MFC编写程序,使其在系统启动时自动运行。这通常通过注册表编辑来实现,因为Windows系统会检查注册表的特定键值来确定哪些程序应该在启动时运行。 首先,我们...

    delphi ex10 android 实现开机自启动

    标题中的"Delphi EX10 Android 实现开机自启动"是指使用Embarcadero Delphi XE10(也称为 RAD Studio XE10)开发的Android应用程序,目的是使其能够在设备启动时自动运行。这个过程涉及到Android系统的权限管理和...

    开机自动运行程序(VB6.0源代码编写)

    - 当不再需要程序开机自启动时,可以通过删除对应的注册表键来移除。 通过以上步骤,你就学会了如何使用VB6.0编写一个简单的开机自动运行程序。不过,这只是一个基础示例,实际应用中可能需要考虑更多的细节,比如...

    如何创建开机自启动程序实例C#.net源代码编写

    在本文中,我们将深入探讨如何使用C#.NET编写一个开机自启动程序的实例。C#.NET是一种强大的编程语言,常用于构建Windows应用程序,包括那些在系统启动时自动运行的程序。下面,我们将详细讲解实现这一功能的关键...

    VC++ 设置 程序开机 自动运行 源代码

    本篇将详细介绍如何使用VC++设置程序开机自启动,并提供源代码参考。 首先,我们需要了解Windows启动目录。在Windows中,有多个启动目录可以用来设置程序开机自启动,最常见的两个是: 1. `C:\Users\用户名\AppData...

    delphi实现软件开机自启动

    提供的压缩包中的“软件自启动”可能包含了实现上述方法的源代码和详细注释,这对于初学者理解Delphi实现开机自启动的具体步骤非常有帮助。通过学习和分析这些代码,你可以更好地掌握Delphi编程以及Windows系统接口...

    android实现开机自启动以及后台运行

    在Android平台上,实现应用的开机自启动和后台运行是一项常见的需求,这通常涉及到服务(Service)、广播接收器(BroadcastReceiver)以及系统权限的管理。在本文中,我们将深入探讨如何在Android 2.1及以上版本中...

    程序开机运行的MFC实现

    在提供的压缩包文件"实例249——使程序开机自动运行"中,应该包含了实现这一功能的源代码示例。你可以下载并研究这些代码,了解它们是如何整合到MFC应用程序中的。通过学习这个实例,你可以更好地理解C++和MFC如何与...

    设置和取消开机自动启动

    这个文件可能是一个C++源代码文件,包含了`RegOpenKeyEx`和`RegSetValueEx`函数调用的示例,用户可以编译并运行这个程序来添加或删除开机启动项。 总之,设置和取消开机自动启动涉及对Windows注册表的修改,这一...

    开机自启动,进程监视和保护程序(附源码)

    压缩包子文件的“开机自启动程序”可能是实现开机自启动功能的源代码,用户可以通过学习和理解这段代码来掌握如何在Windows系统中设置自启动。而“超级监视王”可能包含了更高级的进程监视和保护功能的源代码,可能...

    C# winform利用注册表信息实现开机自动运行软件源代码

    通过以上介绍,我们可以了解到在C# WinForm应用程序中实现开机自启动的基本原理及其实现方法。这种方法虽然简单有效,但在实际应用中还需要考虑到更多的细节问题,比如权限管理、用户体验等。希望本文能够帮助开发者...

    VC实现开机自动启动

    VC++(Visual C++)是微软开发的一款强大的C++集成开发环境,它支持创建各种类型的Windows应用程序,包括实现开机自启动的功能。下面将详细解释如何使用VC++来实现这一目标。 首先,我们需要了解Windows系统中开机...

    C#在开机时自动启动程序

    shortcut.Description = "我的应用程序开机启动"; // 保存快捷方式 shortcut.Save(); } } ``` 这段代码首先定义了你的应用程序的路径(`targetPath`)和快捷方式的路径(`shortcutPath`),然后使用`WshShell`...

    symbian开机自启动(S60 3RD)源代码

    在Symbian操作系统中,尤其是S60第三版平台,创建一个应用使其开机自启动是一项常见的需求。这通常涉及到系统服务、注册表编辑以及对C++编程的理解。下面将详细阐述如何实现这一功能。 首先,我们需要理解Symbian...

    android程序开机自启动示例

    本示例将深入讲解如何实现一个Android程序开机自启动的功能。 首先,我们需要了解Android系统的生命周期。在设备启动时,系统会依次启动各种核心服务,然后广播ACTION_BOOT_COMPLETED意图。这个广播表示系统已经...

    C#设置开机启动源代码

    在Windows操作系统中,C#是一种常用的编程语言,用于创建各种应用程序,包括设置程序自启动的功能。这个"设置开机启动"的源代码可以帮助开发者编写能够随系统启动而自动运行的程序。下面我们将深入探讨如何利用C#来...

    APP自启动模块 实现独个APP开机自启动

    在Android系统中,APP自启动是指应用程序在手机开机或者用户解锁屏幕后自动运行的功能。这在某些场景下是必要的,比如天气更新、消息推送服务等。本教程将详细讲解如何在Android项目中实现一个单独的APP自启动模块。...

    C# winform程序实现开机自启动并且识别是开机启动还是双击启动.zip

    在Windows环境下,实现程序开机自启动的方式通常是将程序的快捷方式添加到“启动”目录或者注册表的启动项中。对于C#来说,可以使用以下方法: 1. **添加启动快捷方式**: - 可以通过`System.IO`命名空间中的`...

    C++编写的软件开机自启工程

    源代码中会详细展示如何实现计划任务的创建、应用程序的启动以及其他必要的功能。 对于开发者而言,这个工程的价值在于其易用性和可移植性。易用性体现在简洁的接口设计,使得其他项目可以简单地调用这些接口来实现...

    wince启动时自动加载SD卡应用程序源代码

    总之,"WinCE启动时自动加载SD卡应用程序源代码"这个主题涵盖了许多关键知识点,包括Boot Loader定制、启动服务注册、应用程序设计、权限管理、调试测试以及源代码分析。掌握这些技能将有助于开发出更加智能和用户...

Global site tag (gtag.js) - Google Analytics