【正文】
。編寫針對 Windows API,但又能轉(zhuǎn)換成其它平臺版本運行的程序, Visual C++現(xiàn)在使你能夠做到這些。這個區(qū)別也許需要程序針對 Macintosh 轉(zhuǎn)換而重新設(shè)計。每個 MDI 子窗口也會自己的菜單 。另一方面 Macintosh 應(yīng)用程序處理的文件名卻類似于 September, 1993 Accounting Data. MDI 窗口允許一個活動窗口框架內(nèi)有多個子窗口,許多 Windows 程序,例如 Microsoft Word 是 MDI 應(yīng)用程序。許多程序員說處理文件名是轉(zhuǎn)換中最費時間和精力的地方。這些是慣例而不是必需的,盡管Macintosh 程序必須有這些等價項。 Windows 應(yīng)用程序通常在窗口左上角有一個系統(tǒng)菜單,這個 菜單包含系統(tǒng)級功能如窗口大小,移動,關(guān)閉窗口,還有一個可以在應(yīng)用程序之間切換的被稱作任務(wù)管理器的項目。 Macintosh 應(yīng)用程序通常包含 Apple menu,它包含了所有桌面安裝的附件,以及應(yīng)用程序的入口。然而 Windows, 給每個處于頂端的窗口以菜單。 Macintosh 只有一個菜單欄,并且不管屏幕上窗口數(shù)量和布局如何 ,它總是處于同一個位置。 Microsoft Windows 和 Windows NT 只能運行在所謂的 littleendian 機器上— 處理器把不重要的字節(jié) 放在前面,把最重要的字節(jié)放在最后面,與之對比, Motorola 680x0 和 PowerPC (一個所謂的 bigendian 結(jié)構(gòu) )把最重要的字節(jié)放在最前面,緊接著放第二重要的字節(jié),依此類推,最不重要的放在最后面。 與之對比, Motorola 68000 和 PowerPC 處理器只能訪問 平坦的 32bit 存儲空間, 理論上說,這種平坦的存儲空間簡化了存儲器尋址。 Microsoft Windows NT是一個純 32bit操作系統(tǒng) , 伴隨著它的出現(xiàn),它所有的應(yīng)用程序都是 32bit的 , 指針和句 柄也都是 32 bits 長。 雖然 Intel x86 處理器從 80386 已經(jīng)開始使用 32bit 尋址 , 但是因為兼容性的原因, Microsoft Windows 實際是一個 16bit 程序 , 并且所有的 Microsoft Windows應(yīng)用程序都要寫成 16 位的。為了支持使用更大的內(nèi)存, Intel 使用分段存儲器結(jié)構(gòu), 這樣利用 16bit 寄存器可以訪問 1 兆 (2^20 bytes)內(nèi)存,還有一個 unsigned 16bit 的偏移量。兩個處理器家族間的區(qū)別包括尋址和字節(jié)排序,還有 opcodes, 指令集 ,以及寄存器的名字和數(shù)量。 因為兩個平臺之間的這些區(qū)別,從一個 Windows 應(yīng)用程序到 Macintosh 程序的轉(zhuǎn)變?nèi)绻麤]有有力的工具,那將是一個艱巨的任務(wù)。 ? Windows 允許 256 位的色彩的操作 。 ? Windows 應(yīng)用程序可以使用畫筆或者畫刷繪圖, Macintosh 應(yīng)用程序只能使用畫筆。在 Macintosh 里,你有一個大的事件循環(huán)來處理所有可能出現(xiàn)的消息。 Windows 和 Macintosh 的 APIs 完全不同,例如 : ? 事件模型不同。 Macintosh 與 Windows 區(qū)別在三個方面: ? 編程樣式的區(qū)別 ? 處理器的區(qū)別 ? 用戶界面的區(qū)別 這些方面的區(qū)別會在下面敘述。 當你已經(jīng)成功地把你的 Windows 程序從 16 bits 轉(zhuǎn)換為 32 bits,你應(yīng)該準備好了著手把它轉(zhuǎn)換成 Macintosh,因為這兩個平臺之間存在很大的區(qū)別,所以這個工作會顯得令人畏懼。接著,把復(fù)雜的函數(shù)和匯編語言函數(shù)用子函數(shù)代替,然后,利用上面的技術(shù)使你的主程序正確的工作。 除了指針,句柄和圖形調(diào)節(jié)也是 32 位, 會解決一些大小不同的問題,但是仍然有一些工作需要作。這些函數(shù)區(qū)別應(yīng)該在你設(shè)計程序時候考慮到??赊D(zhuǎn)換的代碼應(yīng)該能在任意平臺上正確的編譯和執(zhí)行。 遵循上面的方針,將會是你的代碼容易轉(zhuǎn)換,但是,如果你代碼是 16 位的 Windows代碼,那你第一步要做的是使它能在 Win32 下正常工作,這需要你的資源作額外的改變。因此,避免封裝結(jié)構(gòu),限 制對硬件接口與兼容性地東西如文件格式和磁盤結(jié)構(gòu)的封裝。 編譯器經(jīng)常定位在目標機器體系上的結(jié)構(gòu),一些 RISC 機器,例如 MIPS R4000,對排列尤為敏感。使用 Microsoft C 擴充的程序可以轉(zhuǎn)換到 Microsoft Visual C++的任何其它執(zhí)行操作。 Microsoft Visual C++提供了一個編譯器選項,可以用來檢查 ANSI 的兼容性。 美國國家標準委員會( ANSI)對 C/C++的一個主要目標是,提供一個可轉(zhuǎn)換的這種語言的執(zhí)行程序。實際上,由于行程和寄存器用法的過于復(fù)雜,在 RISC 機器上,手動產(chǎn)生的匯編碼要比機器產(chǎn)生的還要差。如果不是必須的,當今的編譯器可以產(chǎn)生和手動產(chǎn)生效果一樣好的匯編碼。像 Microsoft Visual C++這樣有內(nèi)置匯編程序的編譯器,可以很容易的擺脫匯編碼來提高速度。 包含了一些常量,用于輔助書寫?yīng)毩⑷肫脚_的宏,以訪問獨立的字節(jié)。使用可編程的借口去訪問所有的系統(tǒng)或者隱藏“對象”,例如棧或堆。使用 size of()來替換。 不要假定任何事,特別是不要假定數(shù)據(jù)類型的大小、機器的狀態(tài)、數(shù)據(jù)類型排序、或者隊列不要假定簡單數(shù)據(jù)類型的大小,因為它們在不同的處理器上有不同的大 小。 如果你從今天開始編寫可轉(zhuǎn)換性好的程序,那么所有的轉(zhuǎn)換都會變得簡單。 你在函數(shù)名前面加全局運算符 (::)就可以了 . ? 我怎么樣開始使用 MFC? 從類開始,和 /或從讀一些書開始。但是,開發(fā)人員常常對 MFC 有些疑問,例如: ? 如果我需要一種操作系統(tǒng)服務(wù),但應(yīng)用程序框架沒有提供如何處理 ? 直接調(diào)用 Win32 API, MFC 不會阻止你任何 Win32 API 的直接調(diào)用,只要你在函數(shù)名前面加全局運算符 (::)就可以了 . ? 我不懂 C++,還能用 MFC 嗎? 當然可以。 很早的時候,你可以選擇是編寫基于原始 API 或者基于 MFC 的程序。 微軟公司與兩個第三方 UNIX 工具提供商合作密切( Bristol Technology 和 Mainsoft 公司),這使得開發(fā)人員把自己的 Win32 或 MFC 程序針對 UNIX 進行再編譯。這些包括針對 MIPS R4000 處理器系列和前面說的 DEC Alpha AXP 芯片還有 Motorola Power Windows NT 下運行,能都產(chǎn)生針對DEC Alpha 和 Motorola PowerPC 的高度優(yōu)化的 Win32 應(yīng)用程序。 6. 編寫專門的 Macintosh 代碼,可以利用 Macintosh 的獨特特點,利用 Apple 事件或出版和定購。 5. 使用微軟基礎(chǔ)類庫 MFC 實現(xiàn)一些新功能,例如 OLE ,服務(wù)器,客戶端或者利用 ODBC 的數(shù)據(jù)庫支持。這將涉及到使用條件編譯或者設(shè)計到你工程的資源樹。 2. 把你的 Windows 應(yīng)用程 序從 16 位代碼轉(zhuǎn)換成 32 位代碼,這也許是最復(fù)雜和耗時間的工作。轉(zhuǎn)換的幾個步驟取決于你處理的程序是 16 位還是 32 位。 Macintosh 應(yīng)用程序在 Macintosh 平臺上運行,并且在遠端的 Windows 機器上面調(diào)試。這些工具將產(chǎn)生 68000 和 PowerPC的自然代碼,以及 Macintosh 資源。 下面的第一章,說明了 Visual C++是怎樣針對 Macintosh 工作的。這就使你可以開發(fā)單一的源代碼(針對 Win32174。 Microsoft Visual C++針對 Macintosh 提供的跨平臺編輯器提供了一些工具,這些工具是在 Windows NT 或 Windows 95 平臺上運行,可以把 Windows 代碼再編譯,使其適應(yīng) Motorola 680x0 和 PowerPC 處理器。 因為從 Windows到 Macintosh的代碼轉(zhuǎn)換是最難的情形,所以本文重點是這個內(nèi)容。但是這兩個完全不同的操作系統(tǒng)之間有太多的不同,需要開發(fā)人員學習新的 API、新的范例程序、新的工具。本文要關(guān)注的就是與這種新辦法相關(guān)的方法和論點。 但是到了今天,有了一種新的辦法。 ? 利用能跨平臺的工具所 提供的“虛擬 API”。開發(fā)人員希望能夠支持不同的平臺,例如Windows , Windows NT, 和 Windows 95 操作系統(tǒng) , 還有 Apple, Macintosh, UNIX, 和 RISC (reduced instruction set puter)等。s Balloon Help and the Application menu for switching between applications. Windowsbased applications always have a System menu at the upperleft corner of their toplevel window. This menu contains systemlevel functions for sizing, moving, and closing the window, as well as an item that calls the Task Manager for switching applications. Generally, Windowsbased applications contain keyboard equivalents in their menus. These are underlined letters in each menu entry that the user can select with the keyboard in lieu of the mouse. This, however, is convention rather than requirement. Although some Macintosh applications have these equivalents, most do not. Filenames and pathnames represent one of the most fundamental differences between Windows and the Macintosh, as well as perhaps the one most difficult to deal with. Many programmers report dealing with filenames as the area of porting in which the most time and energy is spent. Your Windowsbased application probably already handles (and expects) filenames such as C:\ACCTG\DATA\. Applications for the MSDOS and Windows operating systems are bound by the traditional filename format. Macintosh applications, on the other hand, can handle filenames such as September, 1993 Accounting Data. MDI windows allow for multiple child windows within the borders of a toplevel window (the MDI frame). Many Windowsbased applications, such as the Microsoft Word word processor for Windows, are MDI applications. Characteristic of MDI applications are clipped child windows that can be