2011-09-13 62 views
4

我試圖在Windows 7上使用JNA調用Win32的CreateFile函數,目標是執行this answer檢查一個文件是否被另一個進程使用。使用JNA調用CreateFile給出UnsatisfiedLinkError:查找函數'CreateFile'時出錯:找不到指定的過程

我到目前爲止的代碼是:

import com.sun.jna.Native; 
import com.sun.jna.examples.win32.Kernel32; 

public class CreateFileExample { 

    static int GENERIC_ACCESS = 268435456; 
    static int EXCLUSIVE_ACCESS = 0; 
    static int OPEN_EXISTING = 3; 

    public static void main(String[] args) { 
     Kernel32 kernel32 = 
      (Kernel32) Native.loadLibrary("kernel32", Kernel32.class); 
     kernel32.CreateFile("c:\\file.txt", GENERIC_ACCESS, EXCLUSIVE_ACCESS, 
      null, OPEN_EXISTING, 0, null); 
    } 
} 

然而,運行此引發異常:

java.lang.UnsatisfiedLinkError: Error looking up function 'CreateFile': The specified procedure could not be found.

如果我在loadLibrary調用一些無效的改變"kernel32"然後,而不是我得到The specified module could not be found,所以這表明DLL正在從庫路徑中正確找到,但是我打電話的方式有點問題CreateFile

任何想法我做錯了什麼?


CreateFilecom.sun.jna.examples.win32.Kernel32定義爲:

public abstract com.sun.jna.examples.win32.W32API.HANDLE CreateFile(
    java.lang.String arg0, 
    int arg1, 
    int arg2, 
    com.sun.jna.examples.win32.Kernel32.SECURITY_ATTRIBUTES arg3, 
    int arg4, 
    int arg5, 
    com.sun.jna.examples.win32.W32API.HANDLE arg6); 

回答

6

的Windows API具有的功能(CreateFileACreateFileW),因此你需要指定要調用loadLibrary()時哪一個呢ASCII和Unicode版本:

Kernel32 kernel32 = 
    (Kernel32) Native.loadLibrary("kernel32", Kernel32.class, W32APIOptions.UNICODE_OPTIONS); 

此外,實際上您不需要手動撥打loadLibrary()

Kernel32 kernel32 = Kernel32.INSTANCE; 
+0

嘗試寫功能感謝您,感謝上不需要手動'loadLibrary'尖端。 – mikej

0

這樣


HANDLE hDeviceUSB = Kernel32.INSTANCE.CreateFile(szCom, 
        GENERIC_READ | GENERIC_WRITE, 
        0,    
        null,   
        OPEN_EXISTING, 
        0,    
        null);