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.cpp和smsdatagramsender.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) |
编辑 收藏
实现应用程序的图标隐藏,2nd和S60的3rd差别很大,相对来说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.H和apgrfx.lib。
再次,因为需要在调用其上函数时,必须用我们的应用程序的窗口组id(window group id)初始化(Initialise) TApaTask这个对象,这个实现需要用到,获取当前应用程序窗口组id的函数CEikonEnv::Static()->RootWin().Identifier()。刚好以上函数又要包含w32std.h和w32.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) |
编辑 收藏