我试图使用ReportEventW函数向系统日志写入详细的错误消息。不幸的是,我遇到了一些问题,这些问题显然与函数中的限制有关,但我找不到它们的任何真正的文档:dwDataSize有一个有文档记录的限制,每个字符串的最大长度也有另一个限制。我没有违反任何这些限制,但我仍然收到一个假和GetLastError报告RPC_S_INVALID_BOUND。
通过测试,我发现对于我的测试用例来说,限制是由字符串数(wNumStrings)造成的,而203个字符串是我能够正确传递的最多的字符串(另外,对于204-206个字符串,ReportEventW将返回一个TRUE,但不会写入日志!)。如果我在第一行中添加了1024个虚拟字符,我将再次得到一个错误,并根据我之前添加的字符数来减少行数,这意味着对整个消息的总字符限制即将出现。不幸的是,我无法将它与任何文档中的限制相匹配,即使我忽略了应该适用的限制--我大约33300个字符的值接近于值31839字符(最大值)。(每个字符串的长度),但足以使我放弃对单个字符串长度的限制也适用于整个消息的总长度的理论。显然,如果我添加额外的原始数据,限制再次下降,这意味着对整个事件日志记录大小的限制。
我的问题是:
1)是否有人知道写入事件日志的实际限制?
( 2)不同的操作系统是否会改变这些限制?我所有的测试都是在Win10 x64上进行的,但我非常怀疑,使用不同的OSes,我会遇到不同的限制。
( 3)这里有记载吗?
谢谢。
实际代码(根据请求添加)
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;它使用Messages数组调用,该数组包含来自EurekaLog报表的行(每消息一行,约300行)。
发布于 2019-10-29 11:14:35
我不能全面回答你的问题,但我遇到了一个类似的问题。我只使用wNumStrings和lpStrings参数,与文档相反,仍然收到RPC_S_INVALID_BOUND错误代码(1734)。出于一种唠叨的怀疑,我把字符串的数量减少到了256,它起了作用。果然,它以257的失败告终。不管各个字符串的大小如何,这都是正确的。对于单个字符串和总消息大小,可能也有上限,但我没有费心地计算出它们。
TL/DR:wNumStrings <= 256
https://stackoverflow.com/questions/52714677
复制相似问题