將symbian中GUI的exe程式改為dll程式

來源:互聯網
上載者:User

基本思路:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.