Win32 API的體積相當龐大——包含了數以千計的函數、常數以及數據類型。當然,我們並不想將每個Win32 API函數都寫成對應Java形式。微軟考慮到了這個問題,發行了一個Java包,可通過J/Direct將Win32 API映射成Java類。這個包的名字叫作com.ms.win32。安裝Java SDK 2.0時,若在安裝選項中進行了相應的設置,這個包就會安裝到我們的類路徑中。這個包由大量Java類構成,它們完整再現了Win32 API的常數、數據類型以及函數。包容能力最大的三個類是User32.class,Kernel.class以及Gdi32.class。它們包含的是Win32 API的核心內容。為使用它們,只需在自己的Java代碼裡導入即可。前面的ShowMsgBox示例可用com.ms.win32改寫成下面這個樣子(這裡也考慮到了用更恰當的方式使用UnsatisfiedLinkError):
import com.ms.win32.*; public class UseWin32Package { public static void main(String args[]) { try { User32.MessageBeep( winm.MB_ICONEXCLAMATION); User32.MessageBox(0, "Created by the MessageBox() Win32 func", "Thinking in Java", winm.MB_OKCANCEL | winm.MB_ICONEXCLAMATION); } catch(UnsatisfiedLinkError e) { System.out.println("Can’t link Win32 API"); System.out.println(e); } } }
Java包是在第一行導入的。現在,可在不進行其他聲明的前提下調用MessageBeep()和MessageBox()函數。在MessageBeep()裡,我們可看到包導入時也聲明了Win32常數。這些常數是在大量Java接口裡定義的,全部命名為winx(x代表欲使用之常數的首字母)。
寫作本書時,com.ms.win32包的開發仍未正式完成,但已可堪使用。