基本思路:
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哥仁慈,别给我和谐了。。。 嘎嘎我很记仇的!!!