Oh man, ich werde mit diesen Zeigern nicht warm.
Ich nutze die Methode "EvtRender" aus der wevtapi.dll zum Anzeigen der Ereignisanzeige (ab Vista).
http://msdn.microsoft.com/en-us/libr...s.85%29.aspx):
Code:
BOOL
WINAPI EvtRender(
EVT_HANDLE Context,
EVT_HANDLE Fragment,
DWORD Flags,
DWORD BufferSize,
__out_bcount_part_opt(BufferSize, *BufferUsed) PVOID Buffer,
__out PDWORD BufferUsed,
__out PDWORD PropertyCount
);
Diese habe ich übersetzt mit
Code:
type
PEvtHandle = ^TEvtHandle;
TEvtHandle = type THandle;
function EvtRender(
Context, Fragment:TEvtHandle;
Flags:dword; BufferSize:dword;
Buffer:Pointer;
out BufferUsed:pdword;
out PropertyCount: pdword):bool; stdcall;
Und aufrufen tue ich sie so (Fragment liegt mir vor):
Code:
function UnicodePointerToString(P:Pointer; Size:integer):string;
var Address, i: integer;
begin
Address := Integer(P);
Result:='';
for i:=0 to Size-1 do
if i mod 2 = 0 then
Result:=Result + Chr(PByte(Ptr(Address + i))^);
end;
const EvtRenderEventValues=0;
EvtRenderEventXml=1;
EvtRenderBookmark=2;
BufferSize=8192;
var pdBufferUsed, pdPropertyCount: pdword;
Buffer:Pointer;
GetMem(Buffer, BufferSize);
Result:=WinEvt.EvtRender(0, Fragment, EvtRenderEventXml, BufferSize, Buffer, pdBufferUsed, pdPropertyCount);
xml:=UnicodePointerToString(Buffer, Integer(pdBufferUsed));
FreeMem(Buffer);
Manchmal, aber nicht immer, stürzt mein Programm dabei ab.
Muss ich für Variablen pdBufferUsed und pdPropertyCount mit New oder GetMem Speicher reservieren?
Habe ich die Funktion so richtig übersetzt und aufgerufen?