<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Feeling

        三人行,必有我?guī)熝?/p>

       ::  :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
      185 隨筆 :: 0 文章 :: 392 評(píng)論 :: 0 Trackbacks
    在SWT Extension中,引入了Function這個(gè)類(lèi)。基本上所有的Win32 JNI庫(kù)都有這個(gè)類(lèi),用來(lái)直接操縱Win32 的部分API。有了這個(gè)Class,我們不用編寫(xiě)JNI,就可以實(shí)現(xiàn)某些簡(jiǎn)單的,甚至是較復(fù)雜的Win32 API。這里我們就以EnumWindows這個(gè)API舉例,看看怎么Java來(lái)執(zhí)行這個(gè)Win32 API。
        private static final String FUNTION_ENUMWINDOWS = "EnumWindows";
        
    private static final String USER32_LIB = "user32";
        
    private static List windowsList = new ArrayList();
        
        
    public static int[] enumWindows()
        {
            windowsList.clear();
            Callback callback 
    = new Callback(Windows.class"enumWindowsProc"2);
            
    int address = callback.getAddress();
            
    if (address != 0)
            {
                
    try
                {
                    Function function 
    = new Function(USER32_LIB, FUNTION_ENUMWINDOWS);
                    function.invoke_I(address, 
    0);
                    function.close();
                } 
    catch (Exception e)
                {
                    SWT.error(SWT.ERROR_INVALID_ARGUMENT);
                }
                callback.dispose();
            }
            
    int[] handles = new int[windowsList.size()];
            
    for (int i = 0; i < windowsList.size(); i++)
                handles[i] 
    = ((LONG) windowsList.get(i)).value;
            
    return handles;
        }

        
    private static int enumWindowsProc(int hwnd, int lParam)
        {
            windowsList.add(
    new LONG(hwnd));
            
    return 1;
        }
    EnumWindows是用來(lái)遍歷Windows窗口的API,它需要傳入一個(gè)返回boolean值的callback的地址作為參數(shù)。實(shí)際上在C里面,一個(gè)boolean值無(wú)非就是是否非0,如果為0,則為false,不為0,則為true。我們只需要new 一個(gè)function實(shí)例,傳入這個(gè)API所在的Lib和API名字,然后執(zhí)行invoke方法就OK了,在Function里面,可以最多執(zhí)行含有4個(gè)簡(jiǎn)單類(lèi)型參數(shù)的API。

    讓我們?cè)賮?lái)看看FindWindowEx這個(gè)API,它需要傳入2個(gè)int變量和2個(gè)字符串指針,根據(jù)SWT的設(shè)計(jì),我們是可以將Java的字符串轉(zhuǎn)換為指針的,因此通過(guò)Function我們也可以實(shí)現(xiàn)這個(gè)API:
        private static final String FUNTION_FINDWINDOWEX = Extension.IsUnicode ? "FindWindowExW"
                : 
    "FindWindowExA";
        
    private static final String USER32_LIB = "user32";
        
        
    public static int findWindowEx(int parent, int hwndChildAfter, String className,
                String windowName)
        {
            
    int result = 0;
            
    int lpClassName = 0;
            
    int lpWindowName = 0;
            
    int hHeap = Extension.GetProcessHeap();

            
    if (className != null)
            {
                TCHAR buffer 
    = new TCHAR(0, className, true);
                
    int byteCount = buffer.length() * TCHAR.sizeof;
                lpClassName 
    = Extension.HeapAlloc(hHeap, Extension.HEAP_ZERO_MEMORY, byteCount);
                Extension.MoveMemory(lpClassName, buffer, byteCount);
            }
            
    if (windowName != null)
            {
                TCHAR buffer 
    = new TCHAR(0, windowName, true);
                
    int byteCount = buffer.length() * TCHAR.sizeof;
                lpWindowName 
    = Extension.HeapAlloc(hHeap, Extension.HEAP_ZERO_MEMORY, byteCount);
                Extension.MoveMemory(lpWindowName, buffer, byteCount);
            }

            
    try
            {
                Function function 
    = new Function(USER32_LIB, FUNTION_FINDWINDOWEX);
                result 
    = function.invoke_I(parent, hwndChildAfter, lpClassName, lpWindowName);
                function.close();
            } 
    catch (Exception e)
            {
                SWT.error(SWT.ERROR_INVALID_ARGUMENT);
            }
            
    if (lpClassName != 0) Extension.HeapFree(hHeap, 0, lpClassName);
            
    if (lpWindowName != 0) Extension.HeapFree(hHeap, 0, lpWindowName);
            
    return result;
        }
    其實(shí)像這種簡(jiǎn)單參數(shù)類(lèi)型的API,Win32 里還有很多,我們完全不必為其專(zhuān)門(mén)編寫(xiě)JNI,只需使用熟悉的Java即可。雖然不是調(diào)用全部的API,但大部分常用的API都是沒(méi)有問(wèn)題的,關(guān)鍵是如何靈活運(yùn)用。現(xiàn)在的大型商業(yè)RCP應(yīng)用中,其實(shí)多多少少都參和了JNI,用于提升對(duì)用戶(hù)的友好性和軟件的執(zhí)行性能,畢竟Java天生就是客戶(hù)端開(kāi)發(fā)的矮子。對(duì)于JNI,我們既不能一味排斥,也不能濫用,要把握一個(gè)平衡點(diǎn),使之成為Java客戶(hù)端開(kāi)發(fā)的利器。

    評(píng)論

    # re: 通過(guò)Function類(lèi)來(lái)實(shí)現(xiàn)Win32 API,讓Java代碼代替JNI 2008-05-11 21:00 隔葉黃鶯
    程序編寫(xiě)上好像也沒(méi)怎么變簡(jiǎn)單,同樣需要了解 win32 api 的用法,只是用不著再拉進(jìn)來(lái)一個(gè)寫(xiě) C++ 的人罷,可是對(duì) C++ 的理解還是免不了的。

    作為對(duì) C++, Win32 API 有所掌握的人還是愿意用 JNI 來(lái)寫(xiě)。  回復(fù)  更多評(píng)論
      

    # re: 通過(guò)Function類(lèi)來(lái)實(shí)現(xiàn)Win32 API,讓Java代碼代替JNI 2008-05-11 22:32 三人行,必有我?guī)熝?/a>
    是的,代碼量并沒(méi)有減少。
    但是對(duì)于一個(gè)Java開(kāi)發(fā)人員來(lái)說(shuō),了解Win32 API不難,難的是掌握C++的各種語(yǔ)法,以及指針。就像能使用VB的人很多,能使用VC的人不多一樣。畢竟C++太強(qiáng)大也太靈活了,有時(shí)候過(guò)于靈活反而不是一件好事。因?yàn)槲冶救司褪沁@種人,我看Win32的API一般都去找VB的例子,盡管沒(méi)有學(xué)過(guò)VB,但是很容易看懂,相比VC,VB太簡(jiǎn)單了。我相信同樣的API,用Java實(shí)現(xiàn)和用C++實(shí)現(xiàn),對(duì)Java程序員來(lái)說(shuō)一定是有很大區(qū)別的。  
    回復(fù)  更多評(píng)論
      

    # re: 通過(guò)Function類(lèi)來(lái)實(shí)現(xiàn)Win32 API,讓Java代碼代替JNI 2008-05-12 19:00 銀河使者
    雖然是用Function類(lèi)可以調(diào)用部分api,但要使用swt,是不是還得帶上swt的庫(kù)和dll(linux是.so)啊。

    如果想使用JNI的話(huà),可以選擇使用自己熟悉的語(yǔ)言調(diào)用api,然后再用jni調(diào)用。如delphi也可以編寫(xiě)api。不一定非得要c++。

    這個(gè)不絕對(duì),根據(jù)自己掌握的知識(shí)、能力以及喜好做出選擇吧。多元化世界當(dāng)然得有多元化的選擇了。只有適合自己的才是最好的!!  回復(fù)  更多評(píng)論
      

    # re: 通過(guò)Function類(lèi)來(lái)實(shí)現(xiàn)Win32 API,讓Java代碼代替JNI[未登錄](méi) 2008-07-01 09:01 johnson
    請(qǐng)問(wèn)swt-extension可以用在swing里面嗎  回復(fù)  更多評(píng)論
      

    # re: 通過(guò)Function類(lèi)來(lái)實(shí)現(xiàn)Win32 API,讓Java代碼代替JNI 2008-07-01 11:09 三人行,必有我?guī)熝?/a>
    @johnson
    不可以,是以swt作為基礎(chǔ)的。用swing的JNI工具,應(yīng)該有很多的。  
    回復(fù)  更多評(píng)論
      

    # re: 通過(guò)Function類(lèi)來(lái)實(shí)現(xiàn)Win32 API,讓Java代碼代替JNI 2009-09-27 09:31 sillycat
    在eclipse 3.4.2環(huán)境下,使用org.sf.feeling.swt.win32.extension_1.0.5.v20081205.jar作為插件的lib,運(yùn)行遍歷窗口的代碼,報(bào)下面的錯(cuò)誤,有遇到相同情況的么?請(qǐng)問(wèn)如何解決,謝謝!
    java.lang.UnsatisfiedLinkError: org.sf.feeling.swt.win32.internal.extension.Extension.InvokeII_I(III)I  回復(fù)  更多評(píng)論
      

    # re: 通過(guò)Function類(lèi)來(lái)實(shí)現(xiàn)Win32 API,讓Java代碼代替JNI 2011-07-27 18:41 yj
    jna可能更好哦  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    GitHub |  開(kāi)源中國(guó)社區(qū) |  maven倉(cāng)庫(kù) |  文件格式轉(zhuǎn)換 
    主站蜘蛛池模板: 亚洲另类春色国产精品| 久久黄色免费网站| 久久九九AV免费精品| 亚洲av无码无线在线观看| 91亚洲自偷手机在线观看| 国内精品久久久久久久亚洲| 国产麻豆剧传媒精品国产免费| 67pao强力打造国产免费| 中文字幕av无码不卡免费| 国产成人高清亚洲一区久久| 亚洲AV成人一区二区三区在线看| 老司机亚洲精品影院无码| 亚洲综合伊人久久大杳蕉| 亚洲第一永久AV网站久久精品男人的天堂AV| 免费无码又黄又爽又刺激| 中文免费观看视频网站| 亚洲成人免费在线| 久久免费福利视频| 久久这里只精品热免费99| 99精品免费视品| 亚洲色大情网站www| 亚洲人成伊人成综合网久久| 亚洲国产高清视频在线观看| 亚洲一区二区三区高清| 亚洲高清视频在线观看| 无码久久精品国产亚洲Av影片| 亚洲精品少妇30p| 亚洲色大成网站www永久一区 | 亚洲av无码专区国产乱码在线观看 | 男人的天堂亚洲一区二区三区| 国产精品国产亚洲区艳妇糸列短篇| 亚洲日本乱码一区二区在线二产线| 777亚洲精品乱码久久久久久| 水蜜桃亚洲一二三四在线| 亚洲成年轻人电影网站www | 中文字幕视频免费在线观看| 国产精品无码免费专区午夜| 中文字幕视频在线免费观看 | 亚洲综合色一区二区三区小说| 亚洲精品mv在线观看| 亚洲国产成人精品久久|