В данной статье мы рассмотрим проблему, связанную с интеграцией компонента управления памятью FastMM4 в среду разработки Delphi 7. В частности, рассмотрим задачу запуска приложения и отображения логов, создаваемых FastMM4, при этом приложение может быть установлено в любом месте системы.
Проблема
Разработчик столкнулся с необходимостью запуска утилиты leakTracker.exe для отображения логов, генерируемых FastMM4. Приложение должно было запускаться автоматически при обнаружении утечек памяти. Однако, была проблема с получением пути к утилите leakTracker.exe, так как прямой доступ к стандартным функциям системных модулей SysUtils.pas, Registry.pas и использование ParamStr(0) было невозможно.
Решение
Для решения проблемы можно использовать функции реестра Windows, как было предложено в комментариях на Stack Overflow. Ниже приведен пример кода, который демонстрирует, как можно получить путь к утилите leakTracker.exe через реестр и запустить её с помощью CreateProcess.
uses
Windows;
var
hReg: HKEY;
Ret: LongInt;
RegDataType, RegDataSize: DWORD;
CmdLine: array [0..560] of Char; // размер буфера можно увеличить по необходимости
Len: Integer;
SInfo: TStartupInfo;
PInfo: TProcessInformation;
initialization
{$ifndef BCB}
// код FastMM
{$endif}
finalization
{$ifndef PatchBCBTerminate}
FinalizeMemoryManager; // код FastMM
Ret := RegOpenKeyEx(HKEY_LOCAL_MACHINE,
'SOFTWARE\[YourProgram]',
0, KEY_READ, hReg);
// Замените [YourProgram] на путь к ключу реестра, содержащему путь к вашей программе
RegDataType := REG_SZ;
RegDataSize := SizeOf(CmdLine);
Ret := RegQueryValueEx(hReg,
'path', // значение реестра, содержащее путь к вашей программе
nil, @RegDataType, @CmdLine[0], @RegDataSize);
RegCloseKey(hReg);
// Обработка строки CmdLine для корректного добавления пути к логу
SetLength(CmdLine, RegDataSize);
CmdLine[RegDataSize - 1] := #0;
CmdLine[RegDataSize] := '"'; // открываем двойные кавычки в случае наличия пробелов в пути
Len := GetModuleFileName(0,
PChar(@CmdLine[RegDataSize + 1]), Length(CmdLine) - RegDataSize - 1) + RegDataSize;
// Получаем текущий путь к исполняемому файлу
while CmdLine[Len] <> '.' do // предполагаем, что у исполняемого файла есть расширение
Dec(Len);
CmdLine[Len] := #0;
// Добавляем имя лог-файла
lstrcat(CmdLine, '_MemoryManager_EventLog.txt"'); // закрываем двойные кавычки
ZeroMemory(@SInfo, SizeOf(SInfo));
SInfo.cb := SizeOf(SInfo);
CreateProcess(nil, CmdLine, nil, nil, False,
NORMAL_PRIORITY_CLASS, nil, nil, sInfo, PInfo);
{$endif}
end.
Заключение
Проблема получения пути к приложению для отображения логов FastMM4 в Delphi 7 успешно решена с использованием функций реестра Windows. Это решение позволяет запускать утилиту leakTracker.exe с указанием пути к логу, даже если приложение установлено в произвольном месте системы.
В статье рассматривается процесс интеграции компонента управления памятью FastMM4 в среду разработки Delphi 7, с фокусом на запуск утилиты для отображения логов и получение пути к ней через реестр Windows.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.