franksunny的个人技术空间
获得人生中的成功需要的专注与坚持不懈多过天才与机会。 ——C.W. Wendte

 

EasyDgm是一个用于拦截短消息,发送短信的插件代码。用该插件拦截短信没有提示音,发送也不提示用户。但是本身该代码是老外开发的,只是针对8位编码的字符,没有根据我们中文的编码来做成完全Unicode版本的,为此以下改写就是实现Unicode字符串的发送。

1、  修改DatagramService工程中的代码,将其内用到的8位描述符修改为16位,具体修改的描述罗列如下:

//修改前内容

       IMPORT_C static CDatagram* NewL(TDesC8& aBuf);

       IMPORT_C static CDatagram* NewL(const TDesC8& aBuf,const TDesC8& aAddress);              IMPORT_C virtual const TDesC8& GetData();

       IMPORT_C virtual void  SetDataL(const TDesC8& aData);

       void ConstructL(const TDesC8& aBuf);

       HBufC8* iData;

//修改后内容

       IMPORT_C static CDatagram* NewL(TDesC& aBuf);

       IMPORT_C static CDatagram* NewL(const TDesC& aBuf, const TDesC8& aAddress);              IMPORT_C virtual const TDesC& GetData();

       IMPORT_C virtual void  SetDataL(const TDesC& aData);

       void ConstructL(const TDesC& aBuf);

       HBufC* iData;

2、  修改SMSDatagramService工程中CSMSSender类的代码,将其内用到的8位描述符修改为16位,具体修改的描述罗列如下:

//修改前

void CreateSMSMessageL(const TDesC8& aText, const TDesC8& aAddress);

void SendSMSL(const TDesC8& aText, const TDesC8& aAddress, TRequestStatus& aStatus);

//修改后

void CreateSMSMessageL(const TDesC& aText, const TDesC8& aAddress);

void SendSMSL(const TDesC& aText, const TDesC8& aAddress, TRequestStatus& aStatus);

3、  修改SMSDatagramService工程中CSMSSender类内创建短信的函数CreateSMSMessageL,将原来的代码

smsSettings.SetAlphabet(TSmsDataCodingScheme::ESmsAlphabet7Bit);

改成适合unicode的通道值

smsSettings.SetAlphabet(TSmsDataCodingScheme::ESmsAlphabetUCS2);

4、  删除原有的def,重新为两份工程定稿dll,这个具体参看如何编写dll

以上操作已经将EasyDgm插件修改成适合Unicode的代码类型了,当然该代码中还有可以进行优化的部分,在这里就不多做赘述。

具体使用的时候,可以参考S60v3_EasyDgmTest的例子,一般都是将里面的两份代码smsdatagramreceiver.cppsmsdatagramsender.cpp直接拿来用的,但是也要改成16位描述符。

考虑到有些网友问我要修改后的EasyDgm代码,先特给出下载地址 http://www.cppblog.com/Files/franksunny/EasyDgm.rar

posted @ 2008-05-16 20:12 frank.sunny 阅读(2556) | 评论 (9)编辑 收藏
     摘要:   DLL(Dynamic Link Library)是一段特殊的代码,它能够被外部程序在程序运行的时候调用。在DLL里面的代码可以同时被许多外部程序共享,而且不会引起手机内存的重复分配。   DLL根据接口的类型Symbian系统支持两种类型的DLL:静态接口DLL和多态接口DLL 静态接口DLL在主调程序启动的时候被系统自动载入到手机内存里面(唯一的例外是如果该DL...  阅读全文
posted @ 2008-05-16 20:10 frank.sunny 阅读(4623) | 评论 (0)编辑 收藏

第二版的开机自启动比较麻烦,需要涉及到创建mdl文件并且需要在mdl中将另一程序开启,所以略过。至于第三版的开机自启动相对来说更加简单些:

假设你的应用ID为:ef37946b

1)data下新建一个文件, [ef37946b].rss(注意加上[])文件具体代码如下

#include <startupitem.rh>

RESOURCE STARTUP_ITEM_INFO dispatcher

{

    executable_name = "!:\\sys\\bin\\AutoStart.exe";

    recovery = EStartupItemExPolicyNone;

}

此处的AutoStart.exe是你的应用程序文件名。

注:笔者试图通过修改此处为其他应用程序名从而启动指定其他程序,但是没有成功。

2)mmp文件中增加以下代码

START RESOURCE [ef37946b].rss

TARGETPATH                 \private\101f875a\import

HEADER                                  

END

确保:

LANG              SC

CAPABILITY         ReadUserData

注意“\private\101f875a\import”不能够变。

3)pkg文件中增加以下代码

"$(EPOCROOT)epoc32\data\z\private\101f875a\import[ef37946b].rSC"-"!:\private\101f875a\import\[ef37946a].rSC"

 

如果是采用carbide c++编译,那么使用上述代码就可以了。

如果是使用makesis命令行打包或者使用.Net编译,那么你需要修改成绝对路径,路径名视你的安装目录而定。

例如:

"C:\Symbian\9.1\S60_3rd_MR\Epoc32\Data\z\private\101f875a\import[ef37946b].rSC"-"!:\private\101f875a\import\[ef37946a].rSC"

posted @ 2008-05-09 22:48 frank.sunny 阅读(2751) | 评论 (15)编辑 收藏

实现应用程序的图标隐藏,2ndS603rd差别很大,相对来说3rd因为有一个[appname]_reg.rss文件,所以显得很简单,默认的在APP_REGISTRATION_INFO中有一个属性值:

BYTE hidden = KAppNotHidden;

我们要实现图标隐藏,只需将其值赋为KAppIsHidden即可。具体示例代码如下:

RESOURCE APP_REGISTRATION_INFO

{

       app_file="Hello_Hide_app_0xEC12F4E3";

       localisable_resource_file =  qtn_loc_resource_file_1;

       localisable_resource_id = R_LOCALISABLE_APP_INFO;

       hidden = KAppIsHidden;

       embeddability=KAppNotEmbeddable;

       newfile=KAppDoesNotSupportNewFile;

}

 

2nd版本中显得略微复杂些,具体实现如下(本人尚未测试过):

I installed the application without name (.app only) or in a folder out of \system\apps\<myapp>\, for example, c:\system\data. In that way the app was not in the list.

posted @ 2008-05-09 22:48 frank.sunny 阅读(1976) | 评论 (0)编辑 收藏

首先,需要使程序有获知焦点变化的能力。具体通过在AppUI类中重载CAknAppUi:: HandleForegroundEventL(TBool aForeground )函数来实现。

其次,在获知焦点变化的同时,改变应用程序的焦点,通过TApaTask::SendToBackground()TApaTask::BringToForeground()两个函数来实现。由于这里用到的TApaTask类,需要包含APGTASK.Hapgrfx.lib

再次,因为需要在调用其上函数时,必须用我们的应用程序的窗口组id(window  group  id)初始化(Initialise) TApaTask这个对象,这个实现需要用到,获取当前应用程序窗口组id的函数CEikonEnv::Static()->RootWin().Identifier()。刚好以上函数又要包含w32std.hw32.lib

l         具体实现代码如下:

void CHelloUIAppUi::HandleForegroundEventL(TBool  aForeground)

{

       if(aForeground)

       {

              TApaTask task ( CEikonEnv::Static()->WsSession() );

              task.SetWgId( CEikonEnv::Static()->RootWin().Identifier() );

              //Foreground run

              task.BringToForeground();

              ActivateLocalViewL(iHelloUIContainerView->Id());

       }

       else

       {

              TApaTask task ( CEikonEnv::Static()->WsSession() );

              task.SetWgId( CEikonEnv::Static()->RootWin().Identifier() );

              //background run

              task.SendToBackground();

       }

}

 

posted @ 2008-05-09 22:45 frank.sunny 阅读(3784) | 评论 (2)编辑 收藏
     摘要:   如何在CarBidesymbian 3rd版本下调试控制台程序   本人搭建的环境为ActivePerl-5.8.8.822 + jdk1.6.0_04 + Carbide.C++ V1.2 + S60-SDK-200634-3.1(FP1),至今环境没有发现什么大问题,搭建完调试控制台程序时发现问题——程序编译能通过,但是一旦运行(Run)和调试(Debug)就没有...  阅读全文
posted @ 2008-03-11 19:57 frank.sunny 阅读(2485) | 评论 (0)编辑 收藏

 

今天在单位看计算机世界,看到上面一篇文章写得很不错。摘录和总结了几个句子,同时对里面的观点有达人想说些什么的话,也给小弟以更好的见识:

 

第一点:“以用户体验为中心,站在用户用户的角度、根据用户的理解(而不是程序员的理解)来进行软件开发。关于此有一个基本的原则:就是不能由系统内部的交互来主导涉及,而应该有系统外部的用户与系统的交互进行指导。

这个其实是软件开发的指导原则,软件行业本身就是服务行业,为此对于这个指导原则,个人非常赞同。

 

 

第二点:“重用,介于目前广泛的代码级重用,真正的重用已经开始了核心竞争力的重用,核心竞争力的重用,包括了对业务逻辑重用、业务行为重用乃至最关键的知识的重用。而开源软件的兴起,使得这些基于核心竞争力的高层次重用方式成为可行。”

这点说实话,有点深奥,现在对我来说代码级重用还不是很到家,至于专家所说的核心竞争力重用,知识重用,我还是不能理解到。 如果有哪位高手能够指点迷津一下,那自当心怀感激。

 

第三点:“软件质量要靠程序员修炼真功夫”

这个是毫无疑问的,怎么说,我们做的也是手艺活,修炼是硬道理。

 

第四点“个人修炼到团队修炼的三境界(以修复一个bug为例):

第一境界:不惜努力很有责任心的,修复完这个bug并将其检查过后完事。

第二境界:修复一个后,思考下在项目中是否还有其它地方有过类似操作,并提醒项目团队可能范同样问题的其它同事,由一个bug,解决一类可能存在的bug

第三境界:如果同类型bug出现三四次,作为项目负责人应该考虑:如果是程序员水平问题,那就应该对其进行必要的培训;如果是需求问题,那就需要与客户(策划)进行确认。”

其实这个说得还比较好的,比较形象,我也赞成,说到底还是一个态度问题,现在有多少程序员是已经达到第一境界的哦,我从事团队工作不算长(以前在小公司一直是单干户),在我觉得,这种人很稀有,更何况后面两个境界的了。

 

第四点:“作为一个团队,要非常注重用户的满意度,对团队的成功有高度的荣誉和渴望。”

这一点其实还是一个态度问题,跟第一点有点重复,不过层次更高了些,因为第一点可以说是自上而下的君主立宪,这一点是自下而上的,团队内人人都能做到的道德规范。

 

posted @ 2008-01-17 08:45 frank.sunny 阅读(1527) | 评论 (2)编辑 收藏

 

C中如何调用C++函数?

 

前阵子被问及一个在C中如何调用C++函数的问题,当时简单回答是将函数extern "C"声明,当被问及如何将类内成员函数声明时,一时语塞,后来网上查了下,网上有一翻译C++之父的文章可以作为解答,遂拿来Mark一下。

 

C++ 函数声明为``extern "C"''(在你的 C++ 代码里做这个声明),然后调用它(在你的 C 或者 C++ 代码里调用)。例如:

// C++ code:

extern "C" void f(int);

void f(int i)

{

     // ...

}

 

然后,你可以这样使用 f()

/* C code: */

void f(int);

void cc(int i)

{

    f(i);

   /* ... */

    }

 

当然,这招只适用于非成员函数。如果你想要在 C 里调用成员函数(包括虚函数),则需要提供一个简单的包装(wrapper)。例如:

// C++ code:

class C

{

       // ...

       virtual double f(int);

};

 

extern "C" double call_C_f(C* p, int i) // wrapper function

{

       return p->f(i);

}

 

然后,你就可以这样调用 C::f()

/* C code: */

double call_C_f(struct C* p, int i);

 

void ccc(struct C* p, int i)

{

       double d = call_C_f(p,i);

       /* ... */

}

 

如果你想在 C 里调用重载函数,则必须提供不同名字的包装,这样才能被 C 代码调用。例如

// C++ code:

void f(int);

void f(double);

 

extern "C" void f_i(int i) { f(i); }

extern "C" void f_d(double d) { f(d); }

 

然后,你可以这样使用每个重载的 f()

/* C code: */

void f_i(int);

void f_d(double);

 

void cccc(int i,double d)

{

       f_i(i);

       f_d(d);

       /* ... */

}

注意,这些技巧也适用于在 C 里调用 C++ 类库,即使你不能(或者不想)修改 C++ 头文件。

 该翻译的文档Bjarne Stroustrup的原文链接地址是

http://www.research.att.com/~bs/bs_faq2.html#callCpp

本来贴出来以后受到很多C/C++朋友的关注,非常荣幸,在“梦在天涯”的提醒下,本人后来又完成了一个Demo工程,发现和BJ说的有点出入,希望有高手指点,Demo工程下载链接如下:http://www.cppblog.com/Files/franksunny/cCallCppDemo.rar

 

 

posted @ 2007-11-29 20:38 frank.sunny 阅读(60517) | 评论 (21)编辑 收藏
     摘要:   描述符<下>转换   业余有时候把一个事情当作任务来做的时候,往往会很受限制,就象这篇文档,上次写了个上篇,关于描述符的下篇,自己就迟迟没有勇气和时间写完,好几次都想静下心来好好完成它,但是都未能如愿,可如果不写显然我也不好意思写其它的一些东西,闲话提到这里,花了几天业余时间总算是完成了,该文质量不足之处还望读者您见谅。   通过前面关于描述...  阅读全文
posted @ 2007-11-28 22:51 frank.sunny 阅读(4929) | 评论 (15)编辑 收藏
     摘要:   描述符Descriptors <上>概念和使用   接触Symbian已经一个半月多了,自从上个月熟悉了框架之后,一直都不敢再写什么东西了,因为没有经历过代码怎么可能写得出东西呢?起笔犹豫了很久,打算涉足Symbian与标准C++的一个不同点——描述符。希望自己能够借这个机会搞清楚描述符这个东西。   一、总介 由于手机系统的资源区别于P...  阅读全文
posted @ 2007-10-19 17:23 frank.sunny 阅读(3575) | 评论 (6)编辑 收藏
仅列出标题
共7页: 1 2 3 4 5 6 7 

常用链接

留言簿(13)

随笔分类

个人其它博客

基础知识链接

最新评论

阅读排行榜

评论排行榜