将symbian中GUI的exe程序改为dll程序

基本思路:

1。首先写一个基本的动态链接库(DLL),我说的这个不是静态接口的DLL,如果不会或者没有明白我说的什么意思,没关系我贴一个连接,大家去了解

动态链接库学习例子:http://wiki.forum.nokia.com/index.php/%E4%BD%BF%E7%94%A8RLibrary%E5%8A%A0%E8%BD%BDDLL

 提醒:你可以直接新建一个Dll的工程然后在改成和上面链接例子中一样的东西就行,我就是那么做的,呵呵。

2。写好这个例子后那就成功了一半了(呵呵),然后你需要学会如何使用rsc这种资源(就是我们一般使用的rss那种资源),这个是用也基本和GUI中的exe的程序很像,

 a。你在你的dll的Data这个目录中新建一个rss和一个rls文件名字随便去,不过别取的太抽象了。
 b。建好后在其中都写写什么呢。代码如下:
 rss文件中:
 #include <eikon.rh>
 #include <avkon.rsg>
 #include <avkon.rh>
 #include <appinfo.rh>
 #include <CommonDialogs.hrh> // Enumerations
 #include <CommonDialogs.rh> // Resource structures
 #include "**.rls"
 这些头文件是需要包含的,这些你可以直接重exe的文件中copy过来。
 
 内容写上 :
 RESOURCE RSS_SIGNATURE
 {
 }
 
 RESOURCE TBUF r_title_addcomp { buf=qtn_title_addcomp; }
 rls中:
 #define qtn_title_addcomp "Helloworld"
 
 这样rss文件就写好了。
 c。我们还需要在mmp文件中写些东西,这个是为了生成rsc文件,因为我们加载的时候实际上是加载的这个rsc文件(后面代码会说)
 代码如下:
 SOURCEPATH  ../data

 START RESOURCE *.rss        //和你写在data中的rss文件名一样
 HEADER
 TARGET mReader_0xE56CC67A    //这里名字可以随便取 不过一般取不不容易和别人混的,我是直接从exe中copy的
 TARGETPATH resource/apps
 END //RESOURCE
 d。编译下,然后右键点工程点Freeze export,如果没有err,你搜索sdk目录,你会发现有两个rsc文件,这个时候说明你的rss文件正常生成了rsc文件,那么你的
 就成功了,呵呵。如果没有生成,那恭喜你,自己调试错误吧,嘎嘎。调试错误是学习的一个很重要的过程,希望大家不要烦躁,慢慢来。。
 e。如果以上都正确那么,我就继续讲,在工程中使用这些资源。这个在开始的时候会和gui的exe程序不一样。不一样的地方在,GUI中我们使用资源的时候,是系统
 自己给我加载的,但是dll中我们需要自己加载。这一个的详细介绍可以再google或者nokia wiki上搜到,我就不多说了。贴出关键代码。
 
 TChar drv = "z";
 _LIT(KReourse,"://resource//apps//mReader_0xE56CC67A.rsc");
 DllPath.Append(drv);
 DllPath.Append(KReourse);
 
 iRscOffset = CEikonEnv::Static()->AddResourceFileL(DllPath);
 
 这个是加载资源,一般会写在dll的入口地方,意思就是在dll被加载的时候就调用。这里DllPath是rsc的路径,我这里是给出了一个模拟器上的路径,如果在真机上
 这里的drv这个参数需要更改,改为你安装的盘符。
 这里的iRscOffset是个TInt型,是用来后面卸载这个资源的。
 
 往后使用资源就和GUI中一样了 也是使用StingLoader::Load(资源ID);
 
 使用完,最后需要卸载DLL的资源,使用代码如下:
 CEikonEnv::Static()->DeleteResourceFile(iRscOffset);
 
 
 f。然后你可以使用一个CAknInformationNote对话框,将这个资源显示出来。使用同GUI中一样,可以参考GUI程序的AppUI中HandleCommandL中的使用
 
 能显示出来,那恭喜你这一步成功。如果不成功那就调试。。。 哈哈
 
 提醒:如果上面操作熟练后,你可以将你要修改的GUI的 rss rls文件直接copy过来,然后注释掉rss文件中程序图标的那一段就行了,可以直接使用
 
 删除的代码如下:
 RESOURCE LOCALISABLE_APP_INFO r_localisable_app_info
 {
 short_caption = qtn_caption_string;
 caption_and_icon =
 CAPTION_AND_ICON_INFO
  {
  caption = qtn_caption_string;

  number_of_icons = 1;
  icon_file = "//resource//apps//mReader_0xE56CC67A.mif";
  //icon_file = "//resource//apps//mReader_0xE56CC67_aif.mbm";
  };
 }
 就是这一段。
 
3。在程序中使用图片,很万幸,这个和在GUI中完全一样,可以把这个直接copy到dll中。
 提醒:虽然一样,但是有个地方还是会有些不爽,比如以往我们再打包exe程序的时候,一般都会将这些图片资源打包到exe的private中对应UID的目录下,
 不过现在Dll在安装的时候不会创建自己的私有目录,所以就出现了一些问题,不知道打包到何处。(我这里的意思是为了安全考虑,为了防止不会被用户修改
 或者别的应用程序修改,一般都是会放在private目录下,如果不考虑这个你可以直接将这些图片打包的任何公共目录下,就没有这些烦恼了)。
 
 这里提供几个参考的意见(我就是这么处理的):
 a。将这些图片加给来拉起这个dll的GUI程序让他打在他的private的目录下,Dll在加载的时候去访问GUI的private目录。这种方法是可行,不过有个问题就是在Dll
 更新的时候遇到了问题了。如果有图片资源更新,那么似乎需要更新整个exe程序,这样一般是不会容许的
 b。在安装的时候先写在别的盘符,当调用dll的GUI加载DLL的时候再将 这些图片资源写入GUI程序的private目录
 c。直接在程序中用_L或者用#define的方式将图片定义为一个数组或者buf的方式付给一个变量 然后在运行的时候 直接就将这些东西写入文件 还原为图片,在加载
 这个图片
 
4。这些资源都说完了,在说说如果将view和container这些东西再到Dll中,这个也简单,可以直接将这些文件copy到dll中 ,然后在dll的接口处模拟下GUI中的appui来
 调用,意思可能说的不太明白,看代码吧:
 class MDLLIntface
 {
 public:
  virtual void Great(CAknViewAppUi* aAppUiPoint) = 0;
  virtual void ActiveView() = 0;
  virtual void Destory() = 0;
 };
 a。创建
 这个是我定义的一个DLL的接口,第一个作用是初始化你dll中的view并将它们加到视图服务器,这个就是Great的函数的参数的意义了,如果还有别的要求,你可以自己根据
 需求修改接口。
 
 代码如下
 void HelloDll::Great(CAknViewAppUi* aAppUiPoint)
 {
 CView* view = new (ELeave) CView;
 aAppUiPoint->AddViewL( view );
 AppUiPoint = aAppUiPoint; //这里保存下UI的指针,后面会用到
 }
 
 这样的作用还有一点当dll启动后,往后的按键等事件的处理就完全别dll接管了,知道你销毁掉dll
 b。激活
 一般在这种情况下,肯定不止你的dll种有视图,别人的也应该有视图,所以当启动你的dll不仅要Great,还需要激活,这个方式在我们gui中常常会用到
 我在接口void ActiveView()中实现,代码如下:
 void HelloDll::ActiveView()
 {
 AppUiPoint->ActivateLocalViewL(EHello_world);  //这个是一个界面的UID,和GUI中一样
 }
 c。销毁
 Destory()这个函数就是一些你的dll种的需要在到dll结束的时候销毁掉的东西,
 
 
 写了不少了,说实话很懂东西,无法用语言描述,在者打字有点慢。写着就不想写了,还有就是些的在明白可能也会遇到一些不一样的问题,这个时候就需要交流。
如果有做这样需求的兄弟和姐妹们,我们可以互相交流。
 打个小广告:
 交流群:81389623(devdiv.net)
     95051085 (我是管理员)
     
     平时也可以再devdiv.net论坛上交流
     
 希望mark哥仁慈,别给我和谐了。。。 嘎嘎我很记仇的!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值