ReportEvent限制

时间:2018-10-09 06:33:29

标签: winapi events logging

我正在尝试使用ReportEventW函数将详细的错误消息写入系统日志。不幸的是,我遇到的问题显然与函数中的限制有关,但我找不到关于它们的任何真实文档:dwDataSize有一个已记录的限制,而每个字符串的最大长度还有另一个限制。我没有违反任何这些限制,但是我仍然收到FALSE和GetLastError报告RPC_S_INVALID_BOUND。

通过测试,我发现对于我的测试用例,限制是由字符串数(wNumStrings引起的,其中203是我可以正确使用的最大字符数(另外,对于204-206个字符串,{ {1}}将返回TRUE,但不会写入日志!)。如果我在第一行添加1024个虚拟字符,我再次遇到错误,必须减少行数,据我所知,减少了我之前添加的字符数,这表明总字符数整个消息的限制将发挥作用。不幸的是,即使我忽略了限制,我也无法将其与任何已记录的限制进行匹配-我的大约33300个字符的值接近于31839个字符的值(每个字符串的最大长度),但是足够高让我放弃了这样的理论,即单个字符串的长度限制也适用于整个消息的总长度。显然,如果我添加额外的原始数据,该限制将再次下降,这表明整个事件日志记录的大小受到限制。

我的问题是:

1)有人知道写入事件日志的实际限制吗?

2)这些限制是否随不同的操作系统而改变?我所有的测试都是在Win10 x64上执行的,但是我怀疑使用不同的操作系统会遇到不同的限制。

3)这是否记录在某处?

谢谢。

实际代码(应要求添加)

ReportEventW

使用procedure WriteToEventLog(const Messages: array of string; const RawData: AnsiString); const MaxStringCount = High(Word); // je to WORD! Realne se limit zda byt mnohem mensi MaxRawDataLen = 61440; EmptyMessage = #0#0#0#0; type TPCharArray = array[0..65535] of PChar; var Handle: THandle; Msgs: ^TPCharArray; MsgCount: integer; DataPtr: PAnsiChar; DataLen: integer; i: Integer; begin MsgCount := Length(Messages); if MsgCount > MaxStringCount then MsgCount := MaxStringCount; Msgs := AllocMem(MsgCount * Sizeof(PChar)); try for i := 0 to Pred(MsgCount) do begin if Messages[i] = '' then Msgs[i] := EmptyMessage else Msgs[i] := PChar(Messages[i]); end; if RawData = '' then begin DataPtr := nil; DataLen := 0; end else begin DataPtr := @RawData[1]; DataLen := Length(RawData); if DataLen > MaxRawDataLen then DataLen := MaxRawDataLen; end; Handle := RegisterEventSource(nil, PChar(ParamStr(0))); if Handle <> 0 then begin try ReportEvent(Handle, EVENTLOG_ERROR_TYPE, 0, 0, nil, MsgCount, DataLen, Msgs, DataPtr); finally DeregisterEventSource(Handle); end; end; finally FreeMem(Msgs); end; end; 数组进行调用,该数组包含EurekaLog报告中的行(每条消息一行,约300行)。

1 个答案:

答案 0 :(得分:0)

我无法全面回答您的问题,但我遇到了类似的问题。我只使用了wNumStringslpStrings参数,并且与文档相反,仍然收到了RPC_S_INVALID_BOUND错误代码(1734)。出于怀疑,我将字符串的数量减少到256,并且可以正常工作。果然,它以257失败。无论单个字符串的大小如何,这都是正确的。单个字符串和消息总大小也可能有上限,但是我不必理会它们。

TL / DR:wNumStrings <= 256