Einzelnen Beitrag anzeigen

Benutzerbild von almisoft
almisoft

Registriert seit: 14. Feb 2007
Ort: Berlin
40 Beiträge
 
Delphi 7 Professional
 
#1

Ereignisanzeige: Zeiger und pdword

  Alt 21. Mär 2013, 10:52
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?
Alexander Miehlke
Alexander Miehlke
Wer Schreibfehler findet, darf sie behalten
  Mit Zitat antworten Zitat