JavaからWindowsカーネル関数を呼び出す最も簡単な方法は何ですか?
-
05-07-2019 - |
質問
これを行う方法を探しているうちに、JNIとJNAのようなさまざまなオプションに関する漠然とした議論を見つけましたが、具体的な例はあまりありませんでした。
コンテキスト:Javaの File.renameTo()
が実行できない場合(何らかの理由で、少し問題があります)、kernel32.dll(この回答から):
BOOL WINAPI MoveFile(
__in LPCTSTR lpExistingFileName,
__in LPCTSTR lpNewFileName
);
では、どのようなアプローチを使用しても、Javaコード内からその関数を正確にどのように呼び出しますか?私は、最小限の非Javaコードまたは追加の手順(たとえば、コンパイルまたはデプロイ)を使用して、最も簡単な方法を探しています。
解決
JNAを使用する場合は、 MoveFileW 直接-ユニコード呼び出しとANSI呼び出しのどちらかを選択するための構成情報を提供する必要がなくなります。
import java.io.*;
import com.sun.jna.*;
public class Ren {
static interface Kernel32 extends Library {
public static Kernel32 INSTANCE = (Kernel32) Native
.loadLibrary("Kernel32", Kernel32.class);
public static int FORMAT_MESSAGE_FROM_SYSTEM = 4096;
public static int FORMAT_MESSAGE_IGNORE_INSERTS = 512;
public boolean MoveFileW(WString lpExistingFileName,
WString lpNewFileName);
public int GetLastError();
public int FormatMessageW(int dwFlags,
Pointer lpSource, int dwMessageId,
int dwLanguageId, char[] lpBuffer, int nSize,
Pointer Arguments);
}
public static String getLastError() {
int dwMessageId = Kernel32.INSTANCE.GetLastError();
char[] lpBuffer = new char[1024];
int lenW = Kernel32.INSTANCE.FormatMessageW(
Kernel32.FORMAT_MESSAGE_FROM_SYSTEM
| Kernel32.FORMAT_MESSAGE_IGNORE_INSERTS, null,
dwMessageId, 0, lpBuffer, lpBuffer.length, null);
return new String(lpBuffer, 0, lenW);
}
public static void main(String[] args) throws IOException {
String from = ".\\from.txt";
String to = ".\\to.txt";
new FileOutputStream(from).close();
if (!Kernel32.INSTANCE.MoveFileW(new WString(from),
new WString(to))) {
throw new IOException(getLastError());
}
}
}
編集:コードをチェックした後、回答を編集しました-署名にchar []を使用するのを間違えました- WString 。
他のヒント
これが本当に必要な場合(renameToが機能せず、MoveFileが確実に機能する場合)、 JNA 。ほとんどの作業はすでにcom.mucommander.file.util。 Kernel32.java / Kernel32API.java 。
NativeCallライブラリに基づいて、次の POCアプリケーション。
kernel32.dll
の MoveFileA
関数を使用します
run.batとすべてのjarおよびdllが所定の場所にある完全な作業サンプルとして提供されます。
含まれているtest.txtをtest2.txtに移動します
NativeCallライブラリバージョンが気に入らない場合は、別のを実行しました Javaネイティブアクセス(JNA)ライブラリに基づいた、またはそれに基づいたPOCアプリケーション。今回は、 MoveFileA
と MoveFileW
が実装され、実証されています。