Я использую различные функции Win32 API в своем Java-приложении и использую GetLastError
для получения информации о неудачных вызовах API.
В большинстве случаев это работает, но теперь я обнаружил случай, когда что-то сбрасывает последнюю ошибку.
Это то, что я делаю как в своем приложении Java, так и в приложении VB6:
- Я открываю дескриптор процесса с помощью PID 4 (Система)
- Я звоню
GetModuleFileNameEx
с этой ручкой. - Я звоню
GetProcessImageFileName
с этим дескриптором.
Теперь обе функции API завершаются неудачно, как и ожидалось (они возвращают ноль), и в моем приложении VB6 GetLastError
возвращает 87(«Неверный параметр») после обоих вызовов API.
Но в моем приложении Java только после GetModuleFileNameEx
последняя ошибка установлена равной 87. После GetProcessImageFileName
она всегда равна нулю.
Что я могу сделать с этим?
РЕДАКТИРОВАТЬ:
Вот декларации JNA:
public interface PsApi extends StdCallLibrary {
PsApi INSTANCE = (PsApi) Native.loadLibrary("psapi", PsApi.class,
W32APIOptions.UNICODE_OPTIONS);
int GetModuleFileNameEx(WinNT.HANDLE hProcess, WinDef.HMODULE hModule,
char[] lpFilename, int nSize);
int GetProcessImageFileName(WinNT.HANDLE hProcess, char[] lpImageFileName,
int nSize);
}
И вызывающий код для GetProcessImageFileName
char[] buffer = new char[2048];
int result = PsApi.INSTANCE.GetProcessImageFileName(hProcess, buffer,
buffer.length);
if (result == 0) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}
return new String(Arrays.copyOf(buffer, result));
А для GetModuleFileNameEx
char[] buffer = new char[2048];
int result = PsApi.INSTANCE.GetModuleFileNameEx(hProcess, hModule, buffer,
buffer.length);
if (result == 0) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}
return new String(Arrays.copyOf(buffer, result));