Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Ereignisanzeige: Zeiger und pdword (https://www.delphipraxis.net/173862-ereignisanzeige-zeiger-und-pdword.html)

almisoft 21. Mär 2013 10:52

Ereignisanzeige: Zeiger und pdword
 
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?

DeddyH 21. Mär 2013 10:58

AW: Ereignisanzeige: Zeiger und pdword
 
Ich bin nicht sicher, aber klappt es so?
Delphi-Quellcode:
function EvtRender(
    Context, Fragment:TEvtHandle;
    Flags:dword; BufferSize:dword;
    Buffer:Pointer;
    out BufferUsed, PropertyCount: DWORD):bool; stdcall;
pdBufferUsed und pdPropertyCount dann entsprechend als DWORD deklarieren.

almisoft 21. Mär 2013 11:15

AW: Ereignisanzeige: Zeiger und pdword
 
Ja, du hast recht, ich muss gar nicht pdword nehmen.
Jetzt wird mir vieles klarer. Vielen Dank.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz