Для отладки нашего приложения Delphi XE3 с медленным запуском мы хотели бы регистрировать фазу инициализации всех используемых модулей в нашей системе.
Чтобы выполнить эту задачу, нам нужно имя модуля для каждого вызова инициализации.
Анализируя данные, проходя через InitNames, мы находим внутри первое имя модуля:
InitContext.InitTable^.TypeInfo.UnitNames
но мы не знаем, как получить соответствующее Имя из идентификатора объекта I перед вызовом процедуры Инициализация. В документации по коду говорится, что TypeInfo.UnitNames содержит объединенные имена всех модулей. Но как мне перемещаться между ними? Это не массив и не длинная строка с разделителями.
Код, куда я хотел бы вставить процедуру журнала.
procedure InitUnits;
var
Count, I: Integer;
Table: PUnitEntryTable;
P: Pointer;
begin
if InitContext.InitTable = nil then
exit;
Count := InitContext.InitTable^.UnitCount;
I := 0;
Table := InitContext.InitTable^.UnitInfo;
{$IFDEF LINUX}
Inc(PByte(Table), InitContext.Module^.GOT);
{$ENDIF}
try
while I < Count do
begin
/////////////////////////////////////
MyLogCode( 'Unit: ' + Get UnitName here )
/////////////////////////////////////
P := Table^[I].Init;
Inc(I);
InitContext.InitCount := I;
if Assigned(P) and Assigned(Pointer(P^)) then
begin
{$IF defined(MSWINDOWS)}
TProc(P)();
{$ELSEIF (defined(POSIX) and defined(CPUX86))}
CallProc(P, InitContext.Module^.GOT);
{$ELSE}
TProc(P)();
{$ENDIF}
end;
end;
except
FinalizeUnits;
raise;
end;
end;
Перекомпиляция System.pas будет выполнена с помощью предложенного Арно Бушез решения.