[翻譯]-WinCE 程序設計 (3rd 版)--1.3 第一個Windows CE程序

第一個Windows CE程序
說了這麼多,就讓我們一起看一下你的第一個Windows CE程序吧。列表1-1顯示了Hello1--爲Windows CE寫的一個簡單的Hello World應用程序。

Listing 1-1: Hello1, 一個簡單的Windows應用程序

Hello1.cpp
//======================================================================
// Hello1 - A simple application for Windows CE
//
// Written for the book Programming Windows CE
// Copyright (C) 2003 Douglas Boling
//======================================================================
#include "windows.h"
  
//
// Program entry point
//
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPWSTR lpCmdLine, int nCmdShow) {
  
    printf ("Hello World/n");
    return 0;
}
 
如您所見,除了程序入口點外,代碼看上去十分類似經典的Kernighan和Ritchie版程序。在註釋之後,有一行代碼

#include "windows.h"

這個文件包含了一組文件,它們中定義了Windows API及其用到的結構和常量。

程序的入口點是本程序和標準C程序之間最大的差別。作爲C標準入口
int main (char **argv, int argc)
的替代品,Windows CE通過標準Windows入口點[注1]
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPWSTR lpCmdLine, int nCmdShow);

構建程序環境。
Windows CE在一些方面不同於桌面版的Windows。第1個參數,hInstance爲其它應用程序指明具程序實例,也爲需要驗證這個EXE的Windows API函數提供了程序實例。參數hPrevInstance是從舊的Win16 API(Windows 3.1及更早的系統)遺留下來的。包括Windows CE在內的所有Win32 操作系統中,hPrevInstance 始終是0,可以忽略掉。

參數lpCmdLine指向一個Unicode字符串,包含了命令行文本。從微軟Windows CE瀏覽器啓動的應用程序沒有命令行參數,但在某些情況下,例如當系統自動啓動一個程序時,系統包含一個命令行參數來說明程序爲什麼被啓動。參數lpCmdLine 是Windows CE與XP出現差異的情況之一,在Windows CE裏,命令行字符串是Unicode字符串,在其它版本的Windows 裏,命令行字符串總是ASCII的。

最後一個參數,nCmdShow,指明瞭程序主窗口的初始狀態。由父進程,通常是瀏覽器傳遞這個參數到程序裏。它對應用程序如何配置主窗口給出了說明。該參數可能會規定窗口最初顯示成圖標(SW_SHOWMINIMIZE),或者顯示最大化(SW_SHOWMAXIMIZED)來覆蓋整個桌面,或者顯示爲普通(SW_RESTORE)大小來表明窗口按標準可變大小方式顯示在屏幕上。其它值規定窗口初始狀態對用戶不可見,或者規定窗口可見但不能成爲活動窗口。在Windows CE裏,這個參數的值被限制成3個狀態:普通(SW_SHOW)、隱藏(SW_HIDE)和非激活顯示(SW_SHOWNOACTIVATE)。除非應用程序需要強制它的窗口預先確定狀態,在程序主窗口被創建後,這個值是不加修改,只是簡單的傳遞給ShowWindow函數的。

下一行是這個應用程序唯一的功能行:
printf ("Hello World/n");
Windows CE支持大部分標準C庫,包括printf,getchar等等。這一行有趣的地方在於它不像Windows CE其它任何地方,這個串不是Unicode而是ANSI。下面是對這個現象的合理解釋:對於用ANSI標準編譯的C標準庫,printf和諸如strcpy等其它字符串庫函數用的是ANSI字符串。當然,Windows CE支持這些標準函數的Unicode版,例如  wprintf, getwchar,和 wcscpy。

最後,用return 0;結束程序。
其它進程可以用Win32 API函數GetExitCodeProcess獲取返回值。

構建第一個應用程序
要在你的系統上從頭創建Hello1,可以啓動MS eVC++,在[File]菜單上選擇[新建]創建一個新工程。當看到新工程的對話框,可以明顯的看到WinCE編程與標準Win32編程的變化。你有機會選擇在圖1-1中所顯示的各種平臺。對於非MFC或ATL工程,首選是WCE Pocket PC應用(用於Pocket PC)和WCE應用(用於其它Windows CE系統)。您還可以選擇適當的目標CPU。例如,選擇Win32(WCE MIPI)來爲使用MIPS CPU的Windows CE平臺編譯程序。無論是何種目標設備,都要確保選擇WCE模擬器。這樣你就可以在用XP下的模擬器中運行例子程序了。
圖1-1 平臺列表使eVC++能夠面向不同的Windows CE平臺。

接下來,eVC++會詢問您是否想創建一個空的工程、一個簡單程序或者一個Hello World 應用。對本書裏所有的例子,都選擇空工程。這樣做是爲了避免代碼嚮導向例子添加任何額外的代碼。在[File]菜單選擇[New],Hello1.cpp創建新文件。

當爲Hello 1創建或從CD複製了合適的源文件,選擇Win32(WCE x86em) Debug作爲目標平臺,之後build這個程序。這一步會編譯源代碼,如果沒有編譯錯誤的話,系統自動啓動模擬器,並把EXE程序放到模擬器文件系統裏,接下來你可以啓動Hello1。如果你在Windows 98或Me系統下,模擬器系統能夠會顯示一個錯誤信息,因爲模擬器只能在Win2000或XP下運行。

如果你有Windows CE系統,比如Pocket PC(PPC),把PPC連接到PC上,方法和同步PC的內容到PPC一樣。打開微軟ActiveSync,建立PPC和PC的鏈接。爲了Windows CE設備能夠運行,雖然ActiveSync鏈接並不是必須的,但我發現讓它運行可以爲開發環境和Windows CE系統之間建立一個更穩定的鏈接。

一但PC和Windows CE設備之間的鏈接成功和運行,切換回eVC++,選擇合適的目標設備(如適合iPaq Pocket PC的Win32 [WCE ARM] Debug)進行編譯和rebuild。和爲模擬器創建程序一樣,如果沒有錯誤,eVC++自動下載編譯程序到遠程設備上。程序要麼被放到對象存儲的根目錄上,要麼放在/windows/start菜單目中。

運行該程序
要在嵌入式Winodows CE設備H/PC上運行Hello1,單擊手持式PC的My Computer圖標,找到根目錄下的文件,之後雙擊應用程序圖標啓動程序。

要在Pocket PC上運行程序,從設備的Start菜單選擇程序就可以了。因爲eVC++已經把程序下載到/windows/start菜單所在的目錄了。這種方式下,下載的應用程序自動顯示在Start菜單裏。

有問題?
如果在Pocket PC上點擊圖標或開始菜單選擇Hello1程序,似乎沒什麼反應。在手持式PC上,程序似乎只是刷新了一下屏幕。這是因爲程序啓動、寫到控制檯並結束了。除非你從一個已經創建的控制檯啓動程序,否則Windows CE會在Hello1執行printf語句時,創建一個控制檯窗口,並且在Hello1結束的時候自動關閉控制檯。

在Pocket PC上,應用程序可以運行,但Pocket PC並不爲諸如printf之類的輸出提供控制檯顯示的功能。通過把驅動程序console.dll放到Pocket PC的Windows 目錄裏,可以爲Pocket PC增加控制檯支持。驅動程序從驅動程序接口獲取輸入,創建屏幕窗口,打印輸出字符串。控制檯啓動程序可以從手持式PC和嵌入式版本的Windows CE獲得。

注1:雖然從技術上可以改變入口點原型來匹配C的標準入口點,但通常不值得這麼麻煩的。

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