將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哥仁慈,別給我和諧了。。。 嘎嘎我很記仇的!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章