JNA有一個很奇怪的問題。 我正在使用GetExitCodeProcess()檢查進程是否存在。因此,例如,我知道記事本是PID 2084.當我使用我的方法來檢查PID 2084是否存在時,它在2084和2087之間的PID中返回true(儘管我完全確定PID 2085-2087不會「 t存在)。它對於其他PID(如2083和2088)返回false。JNA GetExitCodeProcess()奇怪地工作
這幾乎就好像存在某種不可能的舍入誤差,而OpenProcess()
正在打開一個不存在的PID句柄!
這發生在所有進程中。如果我列舉所有進程並調用isRunning(PID),則當存在PID + 1,2 or 3
時,它將返回true。否則它返回false,所以至少它是部分工作的。
的圖案總是一樣的,它返回PID和PID + 3.
實施例輸出之間真:
[Notepad PID = 2084, cmd.exe PID = 2100]
isRunning(2083)=False
isRunning(2084)=true
isRunning(2085)=true
isRunning(2086)=true
isRunning(2087)=true
isRunning(2088)=false
.... false .....
isRunning(2100)=true
等。
Interface code:
protected interface Kernel32 extends StdCallLibrary {
Kernel32 INSTANCE = (Kernel32)Native.loadLibrary("kernel32", Kernel32.class);
public Pointer OpenProcess(int dwDesiredAccess, boolean bInheritHandle, int dwProcessId);
int GetLastError();
boolean GetExitCodeProcess(Pointer hProcess, IntByReference lpExitCode);
};
Function code:
public static boolean isRunning(int pid)
{
final int PROCESS_QUERY_INFORMATION = 0x0400;
final int STILL_ALIVE = 259;
final int INVALID_PARAM = 87;
Pointer hProcess = kernel32.OpenProcess(PROCESS_QUERY_INFORMATION, false, pid);
int error = kernel32.GetLastError();
if (error == INVALID_PARAM)
return false; //Invalid parameter.
IntByReference exitCode = new IntByReference();
kernel32.GetExitCodeProcess(hProcess, exitCode);
if (exitCode.getValue() != STILL_ALIVE)
return false;
else
return true;
}
public static void main(String[] args) {
System.out.println(isRunning(2083)); //Proceses with PID 2083, 2085 to 2088 do not exist.
System.out.println(isRunning(2084)); //2084 is notepad
System.out.println(isRunning(2085));
System.out.println(isRunning(2086));
System.out.println(isRunning(2087));
System.out.println(isRunning(2088));
}
謝謝你的有用的文章。你有什麼建議,我保留原來的方法,還是有什麼我可以做的?不幸的是,如果我進入cmd並鍵入taskkill/PID 2084,它會告訴我該進程不存在。 – David
你的問題是關於爲什麼PID + 1,PID + 2和PID + 3都指向相同的過程。我回答說。現在你似乎在提出另一個問題。 'taskkill/pid xxxx'對我來說工作正常。如果你想調試這個問題,這可能是一個不同的問題。事實上,我現在看到你實際上沒有提出直接的問題。我只是解釋了你描述的行爲。 –
啊不,我的意思是: Taskkill/pid作品。 Taskkill/pid + 3 Taskkill/pid + 2和Taskkill/pid + 1不起作用:( – David