Я пытаюсь записать подробное сообщение об ошибке в системный журнал, используя функцию ReportEventW
.К сожалению, я сталкиваюсь с проблемами, которые, очевидно, связаны с ограничениями внутри функции, но я не могу найти какой-либо реальной документации по ним: есть задокументированное ограничение на dwDataSize
и еще одно ограничение на максимальную длину каждой строки.Я не нарушаю ни одно из этих ограничений, но я все еще получаю отчеты FALSE и GetLastError RPC_S_INVALID_BOUND.
В ходе тестирования я обнаружил, что для моего тестового случая ограничение вызвано количеством строк (wNumStrings
), при этом 203 является максимальным значением, которое я могу правильно передать (кроме того, для 204-206 строк ReportEventW
вернет ИСТИНА, но не будет записывать в журнал! ).Если я добавлю 1024 фиктивных символа в первую строку, я снова получу ошибку, и мне придется уменьшить количество строк, насколько я могу судить, на то же количество символов, которые я добавил ранее, что будет означать, что какой-то общий символограничение на все сообщение идет в игру.К сожалению, я не могу сопоставить его с любым задокументированным пределом, даже если я игнорирую то, к чему должны применяться ограничения - мое значение около 33300 символов близко к значению 31839 символов (макс. Длина каждой строки), но достаточно выше, чем эточтобы заставить меня отказаться от теории, что ограничение на длину отдельной строки также применяется к общей длине всего сообщения.По-видимому, если я добавлю дополнительные необработанные данные, ограничение снова уменьшится, что предполагает ограничение на размер всей записи журнала событий.
Мои вопросы:
1) Кто-нибудь знаетфактические лимиты для записи в журнал событий?
2) Изменяются ли эти лимиты в разных операционных системах?Все мои тесты были выполнены на Win10 x64, но у меня есть неприятное подозрение, что с разными ОС я столкнусь с другим ограничением.
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 строк).