我正在尝试使用JNA在Windows 7上调用Win32的CreateFile
函数,目的是执行this answer的Java实现,以检查另一个进程是否正在使用该文件。
我到目前为止的代码是:
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"
调用中的loadLibrary
更改为无效的内容,那么我得到The specified module could not be found
,这样就可以从库路径中找到正确的DLL,但是出现了错误我打电话的方式是CreateFile
。
任何想法我做错了什么?
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);
答案 0 :(得分:6)
Windows API具有ASCII和Unicode版本的函数(CreateFileA
和CreateFileW
),因此您需要在调用loadLibrary()
时指定您想要的那个:
Kernel32 kernel32 =
(Kernel32) Native.loadLibrary("kernel32", Kernel32.class, W32APIOptions.UNICODE_OPTIONS);
另外,实际上您无需手动调用loadLibrary()
:
Kernel32 kernel32 = Kernel32.INSTANCE;
答案 1 :(得分:0)
尝试写这样的功能
HANDLE hDeviceUSB = Kernel32.INSTANCE.CreateFile(szCom,
GENERIC_READ | GENERIC_WRITE,
0,
null,
OPEN_EXISTING,
0,
null);