【发布时间】:2012-03-30 20:10:18
【问题描述】:
我正在使用以下代码通过 JNA 阅读 Windows 应用程序事件日志。我希望能够指定从哪个事件开始,而不是总是从第一个事件开始。有人有什么建议吗?
import java.io.IOException;
import com.sun.jna.*;
import com.sun.jna.platform.win32.*;
import com.sun.jna.platform.win32.WinNT.*;
import com.sun.jna.ptr.IntByReference;
public class test {
public static void main(String[] args) throws NumberFormatException, IOException {
HANDLE h = Advapi32.INSTANCE.OpenEventLog("ServerName", "Application");
IntByReference pnBytesRead = new IntByReference();
IntByReference pnMinNumberOfBytesNeeded = new IntByReference();
Memory buffer = new Memory(1024 * 64);
IntByReference pOldestRecord = new IntByReference();
assertTrue(Advapi32.INSTANCE.GetOldestEventLogRecord(h, pOldestRecord));
int dwRecord = pOldestRecord.getValue();
int rc = 0;
while(true) {
if (! Advapi32.INSTANCE.ReadEventLog(h, WinNT.EVENTLOG_SEQUENTIAL_READ | WinNT.EVENTLOG_FORWARDS_READ,
0, buffer, (int) buffer.size(), pnBytesRead, pnMinNumberOfBytesNeeded)) {
rc = Kernel32.INSTANCE.GetLastError();
if (rc == W32Errors.ERROR_INSUFFICIENT_BUFFER) {
buffer = new Memory(pnMinNumberOfBytesNeeded.getValue());
continue;
}
break;
}
int dwRead = pnBytesRead.getValue();
Pointer pevlr = buffer;
while (dwRead > 0)
{
EVENTLOGRECORD record = new EVENTLOGRECORD(pevlr);
System.out.println(dwRecord + " Event ID: " + record.EventID.intValue());
dwRecord++;
dwRead -= record.Length.intValue();
pevlr = pevlr.share(record.Length.intValue());
}
}
assertTrue(rc == W32Errors.ERROR_HANDLE_EOF);
assertTrue(Advapi32.INSTANCE.CloseEventLog(h));
}
private static void assertTrue(boolean getOldestEventLogRecord) {
}
}
【问题讨论】:
-
dwRecordOffset [in] The record number of the log-entry at which the read operation should start. This parameter is ignored unless dwReadFlags includes the EVENTLOG_SEEK_READ flag.msdn.microsoft.com/en-us/library/windows/desktop/… -
听起来就是我需要的。但我不确定如何将标志合并到我上面的代码中。
-
JNA 3.x.0 已经声明了
WinNT.EVENTLOG_SEEK_READ常量 -
是的,我在那里看到了,只是不确定我的代码中的语法应该如何。
IntByReference dwRecordOffset = new IntByReference();dwRecordOffset.setValue(5);我将 dwRecordOffset 值设置为 5,因为我想从第 5 条记录开始。 -
为什么要将 dwRecordOffset 作为 IntByReference 类型传递?它只是询问整数类型的输入。