4

ファイルが別のプロセスで使用されているかどうかを確認するために、この回答CreateFileのJava実装を行うことを目的として、JNAを使用してWindows7でWin32の関数を呼び出そうとしています。

私がこれまでに持っているコードは次のとおりです。

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.

呼び出しを無効なものに変更"kernel32"すると、代わりに、DLLがライブラリパスから正しく検出されていることを示しますが、呼び出し方法に問題があります。loadLibraryThe specified module could not be foundCreateFile

私が間違っていることについて何か考えはありますか?


CreateFileで定義されcom.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);
4

2 に答える 2

6

Windows API には ASCII および Unicode バージョンの関数 (CreateFileAおよびCreateFileW) があるため、呼び出すときにどちらを使用するかを指定する必要がありますloadLibrary()

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

loadLibrary()また、実際には手動で呼び出す必要はありません:

Kernel32 kernel32 = Kernel32.INSTANCE;
于 2011-09-13T10:40:32.533 に答える
0

このような関数を書いてみてください


HANDLE hDeviceUSB = Kernel32.INSTANCE.CreateFile(szCom,
                    GENERIC_READ | GENERIC_WRITE, 
                    0,              
                    null,          
                    OPEN_EXISTING,  
                    0,              
                    null);
于 2013-02-14T06:24:43.723 に答える