2010年7月26日 星期一

部份Java技術的素描

http://ender110.blogbus.com/logs/4112843.html

    學了Java這麼久了,感覺起來就是累,不是因為學習上的勞累,而是一種匆忙追趕的勞累。 Java世界的變化真是太快了,誇張一點說,前一天你覺得什麼都會了,當你第二天一覺醒來就會發現說不上從哪又飛出了一個新名詞。 用老崔的一句話來表達此時的心裡是最恰當的了:“不是我不明白,這世界變化得太快。


    也許你已經學了很常時間的Java了,也許你現在正想學習Java,無論怎樣,還是讓我們先停下來整理一下Java雜亂的名詞吧,這些名詞術語就像一張無 邊 無際的網,我們輕易地就會被困在網中央,為了使我們不至於越陷越深越迷惘,路越走越遠越漫長,我們只有逐個擊破,一一搞懂,這樣才會前途一片光亮嘛。


    第一個出場的是誰? 當然是Applet啦。 它是什麼東東? 可能許多人都聽說過了,Applet就是嵌入到Web網頁中的一段Java代碼。 這是最初的動態網頁技術,是用來活躍氣氛的,許多人都用它來畫一副漂亮的圖來活躍一下自己的網頁,高手們用它來進行一些遠程事務等等。 不過現在它有點受冷落了,原因是Flash、DHTML、ASP、JSP們強佔了它的一大部分地盤,它勢單力薄,唉,只有聽從命運的安排了。


    第二個出場的當然是Applet的姊妹了,她就是Servlet Servlet就是為了增強Web Server的能力在Web Server 上運行的一個java小程序,Servlet用一個java的特定方案代替了其它一些服務器方編程技術,如:CGI、ISAPI、NSAPI等等。 由於客戶端仍使用瀏覽器,所以Servlet不需重新定義通訊協議,她直接使用HTTP協議。 由於她的身段不肥也不瘦並且編譯後的代碼速度也不錯,現在她正受歡迎著呢。


    (正說著,JSP急不可待得衝了出來……),哦,因為她覺得自己比Servlet強。 JSP就是Java Server Page,他是將Java代碼嵌入到HTML文檔之中形成的一種頁面,這個頁面由Java服務器執行生成最終的客戶端的純的HTML頁面。 其實,大家可能早已經熟悉了幾年前流行的微軟的ASP技術,他倆原理上是一樣的,只不過是ASP中使用VBScript,並且由服務器解釋執行,而JSP使用的是Java,優點自然是繼承了許多Java的優點了,如:垃圾回收、其它的企業技術等等。 另外,JSP在第一次執行時被編譯,以後再執行時執行的就是編譯後的代碼了,所以他的另一個優點就是速度上要快一些了。


    下一個閃亮登場的是EJB(掌聲四起),哇,他確實是個大明星,很紅的。 他是何許人? 聽我慢慢道來,EJB就是Enterprise Java Beans,他是服務器組件的標準,他的出現的目的就是為了對創建分佈式、物件導向應用程序組件定義一個統一、標準的方法,使創建網絡能動性程序變得簡單一點。 大家千萬不要把他與Java Beans 搞混了,他們是兩回事,Java Beans是為了一般應用程序組件定義了標準的接口。 但是,有時一個程序可能使用EJB和Java Beans兩種技術,因為它可以是一個程序的服務器同時又是另一個程序的客戶。


    該JDBC出場了,他的牌子比較老,認識他的人也比較多。 JDBC就是Java Database Connectivity,他是一組應用程序接口,定義了一個訪問數據庫(主要指關係型數據庫)的標準的Java庫。 因為許多企業開發者都有應用程序訪問數據庫的需求,所以Sun公司的JavaSoft小組開發了JDBC。 這樣,數據庫系統開發商提供數據源驅動程序就有了一個標準的結構,並且這些驅動程序允許Java程序直接訪問其相應的數據庫產品。


    下一個出場的是JNDI Internet 和Intranet在很大的程度上依賴命名和目錄服務來訪問網絡資源,這種服務使得一些關於用戶、機器、其它網絡服務以及遠程應用程序的信息得到了網絡級的共享。 JNDI即Java Naming and Directory services Interface,他是一組API,其定義了訪問諸如DNS、LDAP、RMI等命名和目錄服務的一種標準的Java方法。 他的功能非常強大,因為他通過單獨的一套API可以訪問各種各樣的服務,其作用在應用中不容忽視。

VC++6.0 下搭建wxWidgets 開發環境

http://dev.firnow.com/course/3_program/java/javaxl/2008109/149372.html
2008-10-09 作者:佚名

和GTK、QT、SWT、SWING 一樣,wxWidgets 也是一種開源跨平台的GUI 框架。 因wxWidgets 和MFC 有些淵源,有些親近,故要體驗一番wxWidgets。 現在最新版是2.8.7。 wxWidgets 程序還可運行於Windows CE、Palm OS。 不但包括GUI,還有Media、Socket、ODBC 等庫。

詳情請見wxWidgets的官方網站是: http://www.wxwidgets.org

本篇介紹VC++6.0 下如何搭建wxWidgets 的開發環境,包括編譯wxWidgets 源碼和配置VC 環境。 所用wxWidgets 的版本是2.8.7。

第一步:下載並安裝wxWidgets

http://www.wxwidgets.org/downloads/下載到wxWidgets源碼。
你可以下載Windows安裝版http://prdownloads.sourceforge.net/wxwindows/wxMSW-2.8.7-Setup.exe (11.9M)
或者是Zip壓縮版http://prdownloads.sourceforge.net/wxwindows/wxMSW-2.8.7.zip (15.9M)

假如我們下載的是wxMSW-2.8.7-Setup.exe,就可運行它,過程中我們假定選擇的安裝目錄是d:\wxWidgets-2.8.7 完成後,我們看到安裝目錄所在空間的大不是127M。

注意要給wxWidgets 有足夠的剩餘空間,單是編譯一個版本的靜態庫就會增至300多M,如果還要編譯動態庫再選擇上DEBUG 或者RELEASE、ASCII 或是UNICODE 等,還要編譯sample 的話,最後空間能夠暴到2G。

第二步:編譯wxWidgets

編譯方式有兩種,一種是在VC++ 中打開wx.dsw 進行編譯,另一種是用nmake 在命令行下編譯。

1) nmake 編譯

運行cmd.exe 來到命令行下,進入到目錄d:\wxWidgets-2.8.7,然後執行

D:\wxWidgets-2.8.7> nmake -f makefile.vc

默認是編譯成DEBUG 版的靜態庫。 也許我們在編譯之前需要根據自己的需要進行一些設置:

打開D:\wxWidgets-2.8.7 \include\wx\msw\setup.h

保證第110行的#define wxUSE_DEBUG_NEW_ALWAYS設置為0。 默認是0 的。
將1137行的#define wxUSE_IOSTREAMH設置為0,否則無法使用VC的模板庫(不能用std命名空間下的)。 默認是1。
如果要使用wxWidgets提供支持數據庫的ODBC類,將#define wxUSE_ODBC設為1。 默認是1。

如果你想生成動態庫,或生成的是Release版的,你可以修改D:\wxWidgets-2.8.7 \build\msw\config.vc文件。 打開該文件你能看到可以更改的選項,其中重要的幾個如下:

# What type of library to build? [0,1] -- 生成庫的類型,0為靜態庫,1為動態庫
SHARED = 0

# Compile Unicode build of wxWidgets? [0,1] -- 是否使和UNICODE,0 否,1 是
UNICODE = 0

# Type of compiled binaries [debug,release] -- 是debug 還是release
BUILD = debug

其中還有許多顧名思義的選項,請根據需求修改。

對於config.vc 中的選項也可以通過命令行覆蓋掉配置文件中的值,如編譯命令用

D:\wxWidgets-2.8.7> nmake -f makefile.vc SHARED=1 UNICODE=1 BUILD=release

就是編譯release 版,支持UNICODE 的動態庫了。

動態庫和靜態庫的不同體現在使用上,靜態庫中的代碼能編譯進應用程序的exe 文件中,這個exe 文件可單獨發佈,但體積較龐大。 動態庫可讓exe 文件執行時加載,雖然exe 文件體積小了,但發佈時必須帶著相應的動態庫文件。

2) VC 編譯還可用VC++ 打開D:\wxWidgets-2.8.7\build\msw\wx.dsw,然後選擇Build->Batch Build... ,我們看到每個工程都有16 個配置,請根據應用需求勾選你的配置,如所有工程的Win32 Release 和Win32 Debug 版本,然後Build,如果你照單全收,編譯將非常耗時而佔空間。 這種編譯方式就是可以一下操作幫你編譯出所有需要的版本。

好,等等編譯完之後,在目錄D:\wxWidgets-2.8.7\lib\ 會有產生一個目錄:vc_lib 是靜態庫的目錄,默認編譯有17 個靜態。 如果是編譯成動態庫則會產生目錄vc_dll。 在vc_lib 中有mswd 目錄,release 版對應的是msw,裡面含有Debug 和Release 版的setup.h。

注意到Debug 版和Release 以及和UNICODE 、動態庫、靜態庫組合條件編譯生成的文件和目錄名。
靜態庫編譯到D:\wxWidgets-2.8.7\lib\vc_lib 目錄中動態庫編譯到D:\wxWidgets-2.8.7\lib\vc_dll 目錄中文件命名為wxmsw28d_core.lib 文件為例:
wxmsw28_core.lib ---- Release,非UNICODE 版
wxmsw28d_core.lib ---- Debug,非UNICODE 版
wxmsw28u_core.lib ---- Release,UNICODE 版
wxmsw28ud_core.lib ---- Debug,UNICODE 版對於dll 文件的命名規範也一樣的。
在vc_lib 和vc_dll 下如果全編譯了會有四個目錄,msw、mswd、mswu、mswud 意義同上。

編譯完後可以把那些過程中的目標文件刪了,它們佔的空間實在是太大。 要是你還想以後重新編譯用就留著吧。

第三步:創建wxWidgets項目

創建一個Win32 Application 的空項目,項目名為wxHello
Proejct->Settings (Alt+F7) 進入項目設置
1. C/C++選項卡->Code Generation -> use run-time library設置為: Debug MutilThread DLL
2. C/C++選項卡-> PreProcessor -> PreProcessor Definitions設置加上__WXMSW__,__WXDEBUG__ ,如果是Release版,則只需加上__WXMSW__
3. C/C++選項卡-> PreProcessor -> Additional include directories設置為D:\wxWidgets-2.8.7\include,D:\wxWidgets-2.8.7\include\lib\vc_lib\mswd ,這是設置附加Include 路徑。
4. Link選項卡-> Input -> Object/library modules設置加上wxmsw28d_core.lib wxbase28d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib這些Lib(沒有這四個lib comctl32.lib rpcrt4.lib winmm.lib wsock32.lib的話請加上,關鍵是前兩個)。 如果要使用wxODBC就加上 wxbase28d_odbc.lib
5. Link 選項卡-> Input -> Addtional library path 設置為: D:\wxWidgets-2.8.7\lib\vc_lib。

注意:編譯成不同版的執行代碼應填入相應的Additional include directories和Addtional library path。
編譯成依賴DLL的執行文件還需要加上預處理指令 WXUSINGDLL
UNICODE編譯則需要加上預處理指令 _UNICODE
還有一種 Universal 編譯,要加上預處理指令 __WXUNIVERSAL__

這樣一個普通的WxWdigets項目就設置好了.

我們測試WxWidgets 自帶的例子minimal。 新建一個minimal.cpp 文件,內容同D:\wxWidgets-2.8.7\samples\minimal\minimal.cpp,編譯,不出意外,成功了!

也可設置全局的目錄

前面我們是為項目配置Additional Include Directories 和Additional library path。 我們可以把這設置成全局的。 就可以不用在項目中單獨設置。 全局設置有其缺陷,無法分開是vc_lib 還是vc_dll 中的lib,是mswd 還是msw 中的wx/setup.h 文件。 在這裡設置Source Files 還是必要的。 並且在下面前兩個Include Files 放在全局設置裡也較合適。

進到VC++ 的 Tools->Options->Directories,選擇"Include Files" 後,添加
D:\wxWidgets-2.8.7\include
D:\wxWidgets-2.8.7\contrib\include
D:\wxWidgets-2.8.7\lib\vc_lib\mswd

對應於Project Settings -> C/C++ Tab->Preprocessor 中的Additional include directories

再選擇"Libraries Files",添加
D:\wxWidgets-2.8.7\vc_lib

對應於Project Settings -> Link Tab -> Input 中的Additional library path

再選擇"Source Files",添加
D:\wxWidgets-2.8.7\src

最後大致比較一下生成程序的大小

Release 靜態庫版(vc_msw) minimal.exe 1.11M,可單獨發佈
Debug 靜態庫版(vc_mswd) minimal.exe 2.52M,可單獨發佈
Release 動態庫版(vc_mswdll) minimal.exe 68K,加上wxmsw28_core_vc_custom.dll (2.85M) 和wxbase28_vc_custom.dll (1.11M),共4M
Debug 動態庫版(vc_mswddll) minimal.exe 96K,加上wxmsw28d_core_vc_custom.dll (4.26M) 和wxbase28d_vc_custom.dll (1.82M),共6.1M

這是一個簡單的wxWidgets 程序,只用到了兩個動態庫的情況。 在用到wxWidgets 庫較少時用靜態庫來編譯發佈文件會小一些,若是用到組件多的時候,可能用動態庫方便些,請酌情決定。


參考:1. C++開源跨平台類庫集
2. wxWidgets-2.8.3編譯和在VC中的配置
3. vc++6.0下wxWidgets程序開發環境的設置
4. 在Visual C++ 6中配置wxWidgets項目
5. 如何調用DLL (基於Visual C++6.0的DLL編程實現)