首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReportEvent极限

ReportEvent极限
EN

Stack Overflow用户
提问于 2018-10-09 06:33:28
回答 1查看 235关注 0票数 2

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

通过测试,我发现对于我的测试用例来说,限制是由字符串数(wNumStrings)造成的,而203个字符串是我能够正确传递的最多的字符串(另外,对于204-206个字符串,ReportEventW将返回一个TRUE,但不会写入日志!)。如果我在第一行中添加了1024个虚拟字符,我将再次得到一个错误,并根据我之前添加的字符数来减少行数,这意味着对整个消息的总字符限制即将出现。不幸的是,我无法将它与任何文档中的限制相匹配,即使我忽略了应该适用的限制--我大约33300个字符的值接近于值31839字符(最大值)。(每个字符串的长度),但足以使我放弃对单个字符串长度的限制也适用于整个消息的总长度的理论。显然,如果我添加额外的原始数据,限制再次下降,这意味着对整个事件日志记录大小的限制。

我的问题是:

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

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

( 3)这里有记载吗?

谢谢。

实际代码(根据请求添加)

代码语言:javascript
复制
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行)。

EN

回答 1

Stack Overflow用户

发布于 2019-10-29 11:14:35

我不能全面回答你的问题,但我遇到了一个类似的问题。我只使用wNumStringslpStrings参数,与文档相反,仍然收到RPC_S_INVALID_BOUND错误代码(1734)。出于一种唠叨的怀疑,我把字符串的数量减少到了256,它起了作用。果然,它以257的失败告终。不管各个字符串的大小如何,这都是正确的。对于单个字符串和总消息大小,可能也有上限,但我没有费心地计算出它们。

TL/DR:wNumStrings <= 256

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52714677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档