我正在尝试使用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行)。
答案 0 :(得分:0)
我无法全面回答您的问题,但我遇到了类似的问题。我只使用了wNumStrings
和lpStrings
参数,并且与文档相反,仍然收到了RPC_S_INVALID_BOUND
错误代码(1734)。出于怀疑,我将字符串的数量减少到256,并且可以正常工作。果然,它以257失败。无论单个字符串的大小如何,这都是正确的。单个字符串和消息总大小也可能有上限,但是我不必理会它们。
TL / DR:wNumStrings <= 256