1.在資源檔中添加了一個功能表項目,.hrh. .rss及handlecommandL都做了相應修改,但運行時總出現這兩個錯誤:
VRex fatal error U1077: “perl” : 傳回碼“0x1”
VRex error PRJ0019: 工具從"Building resources from VRex_caption.rss"
在../VC7/bin目錄下添加msobj71.dll,(這檔案在../common/IDE目錄下存在)
環境變數的設定:(作為參考,這隻是我機子安裝相關開發軟體的路徑,請根據自已的實現做相對修改)
Path
C:/Program Files/Common Files/Symbian/Tools;C:/Program Files/PC Connectivity Solution/;C:/Perl/bin/;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;C:/Program Files/Java/jdk1.5.0_11/bin;C:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/bin;C:/Program Files/Nokia/CodeWarrior for Symbian v3.1/Bin;C:/Program Files/Nokia/CodeWarrior for Symbian v3.1/Symbian_Tools/Command_Line_Tools
CLASSPATH
D:/Tools/Java/jdk1.5.0_11/lib
EPOCROOT
/Symbian/8.0a/S60_2nd_FP2_SC/
2.鬱悶:今天編譯器時老提示"Shell error LNK2019: 無法解析的外部符號 "public: __thiscall CameraServer.SetLightingConditions(RCameraServ::ELightingNormal);,該符號在函數 "public: void __thiscall CCameraManager:ConstructL(class TRect const &)" (ConstructL@CCameraManager@@QAEXABVTRect@@@Z) 中被引用"類擬的error.在明明在*mmp已加
LIBRARY CameraServer.lib ,在cmd 都可編譯通過,可是在vc7老提示上述錯誤.
後來我引入一個庫檔案才能解決這個問題,請在項目資源管理員中右擊項目->屬性->配置屬性->連結器->命令列 ,在右邊的 附加選項 中輸入 CameraServer.lib.
原因:可是有時直接在mmp添加庫檔案是不能生效的.
3.鬱悶 "c:/Symbian/shell/src/ShellAppUi.cpp(457): error C2664: “CAknViewAppUi::AddViewL” : 不能將參數 1 從“CHelpView *”轉換為“CAknView *” "這鬼問題困惑了我一晚上,原來是HelpView.h中沒繼承CAknView.
解決:class CHelpView : public CCoeControl, MEikListBoxObserver,CAknView
4.暫沒解決
error C2243: “類型轉換” : 從“CHelpView *”到“CAknView *”的轉換存在,但無法訪問"
5.鬱悶.困惑我一天.不過也很爽的.終於解決了.以後多多學習,積累經驗.
Error:EIKCTL 42 一般沒提示哪處出錯或中斷.只會顯示"程式已關閉".
所以很難尋找到出錯的地方,唯有好好增強編程思想.
通過上網查了些有關的資料和請教技術Q群的大俠們.得知:
1.繪製控制項Draw()時出現無效的資源控制代碼,如bitmap等。
2.還有ComponentControl函數是否返回了正確的指標
3.CountComponentControls函數是否返回了正確的控制項數量
通過仔細檢查相關代碼:
//iHelpListBox = new (ELeave) CAknSingleGraphicStyleListBox;
應用:
iHelpListBox = new (ELeave) CAknSingleStyleListBox;
因為我採用的是沒表徵圖顯示的ListBox.
6. Differences on Coding requirement from WINSCW UDEB emulator
and ARMI UREL real handset compilation:
(1). // this works in Emulator (WINSCW UDEB)
// this fails in ARMI UREL
switch (selection)
{
case EONE:
doSomething();
break;
}
// this works in both Emulator and ARMI UREL
switch (selection)
{
case EONE:
{
doSomething();
break;
}
}
(2). 發現send 的message中用(TDesC)傳入的String在手機都不能顯示
Fixed , 用
方式1: (working in handset)
TBuf<Kshortlen> Kusername;
Kusername.Append(_L("Supersoar"));
msgRegister(Kusername, TRUE, sendBuf);
代替
方式2:
_LIT(Kusername, "Supersoar");
msgRegister((TDesC)Kusername, TRUE, sendBuf);
上面的方式2,Kusername在模擬器沒問題,在手機上不能正常顯示
改成用方式1後用ARMI compile就沒有原來的warning了
(credit: Supersoar)
7.error PRJ0019: 工具從"正在執行預建置事件..."
VS 2003可以在"輸出"視窗中選擇"產生"項來查看更詳細的錯誤資訊.
8.symbian開發過程要注意的一些問題.以下為轉貼:
1:調用可能異常退出的函數時,考慮如果程式在該處退出,將發生什麼問題,必要時清理API函數。
2:任何遊可能發生異常退出的函數應該以L結尾
3:使用(ELeave)來執行個體化對象。但是要記住,這些代碼這時也會異常退出。
4:始終只將一個堆類聲明為一個指標,並通過new來建立堆類,決不以自動變數方式聲明或者執行個體化堆類。
5:如果調用一個以LC結尾的函數,必須從清理棧彈出由該函數返回的指標,否則調用函數退出時,程式會崩潰。
6:對CBase類的對象、簡單buffers和不帶解構函式的對象,只使用CleanupStack::PushL()方法。
7:編寫DLL時,.h檔案內,對希望為DLL使用者可用的函數,在各函式宣告前放置IMPORT_C,並在個函數的實現前面放置EXPORT_C
8:在DLL中不使用可寫的全域資料。任何外部全域變數必須為const類型。模擬器構建可能會繞幸成功,但是在手機上構建時會報錯。
9:在EXE檔案中可使用可寫的全域資料。
10:遵循成員變數、參數、枚舉類型、常量和宏的命名標準。
11:當建立一個在堆中進行執行個體化的對象時,從CBase類派生,並在類名前添加首碼C
12:使用Symbian OS API時,包換SDK文檔指定的標頭檔和匯入庫。