Delphi 7,使用FastMM4获取应用路径并打开应用

Posted

技术标签:

【中文标题】Delphi 7,使用FastMM4获取应用路径并打开应用【英文标题】:Delphi 7, use FastMM4 for getting application path and open application 【发布时间】:2012-06-09 10:56:41 【问题描述】:

我正在Delphi 7 中开发一个应用程序,它将运行并显示由FastMM4.pas 创建的日志。

应用程序将安装在系统的任何位置。我已经修改了FastMM4.pas,这样它就可以CreateProcess(简而言之,执行我的应用程序) 我的previous Question和Sertac Akyuz's answer的代码

leakTracker.exe会以fastmm4的日志文件为参数,打开文件并显示。修改后的fastMM4.pas 将用于任何其他应用程序。

Procedure OpenTheLeakReader
 begin
 CmdLine := 'C:\Program Files\leakTracker\leakTracker.exe "';  
 lstrcat(CmdLine,CTheArGuements ); 
 ZeroMemory(@SInfo, SizeOf(SInfo));
 SInfo.cb := SizeOf(SInfo);
 CreateProcess(nil, CmdLine, nil, nil, False,  NORMAL_PRIORITY_CLASS, nil, nil, sInfo, pInfo);
end;

这很好,但我已经硬编码了path,因为要获取我的应用程序路径..

                 [FastMM4]  -cannot use SysUtils.pas     //*1
                            -cannot use Registry.pas     //*2
                            -cannot use ParamStr(0)      //*3
                            -cannot use unitWithSysRegis //*4

                 [someAplicationWhichWillUseFastMM4] -Uses FastMM4.pas  

FAstMM4.pasfinalization我有这个

          if ifLeakedMemory then OpenTheLeakReader;

因为我不能拥有

*1 - SysUtils.pas - 在 FastMM4.pass 中,因为这将卸载 fastmmm4

*2 - Registry.pas - 搜索leakTracker安装路径但会卸载fastmm4

*3 - paramstr(0) - 应用程序结束时出错。

*4 - unitWithSysRegis - 使用 SysUtils,在 Fastm4 使用子句中也无法注册。

所以我被困在如何获取leakTracker.exe的路径并通过CreateProcess将日志文件的路径发送到`leakTracker.exe'。

【问题讨论】:

您可以自己导入 Windows registry functions 吗? @Blorgbeard 我不知道该怎么做……有什么例子吗? 其实可以用windows单位吗?它有RegOpenKeyExRegGetValueEx 等。如果没有,您可以从那里复制定义。 @Blorg FastMM 不能使用隐式系统以外的任何单位。 @sertac 如果是这样,那是因为 Windows.pas 在其初始化时不进行堆分配 【参考方案1】:

(首先解释一下(关于问题中的链接问题),这个问题不仅仅是不能在 FastMM4.pas 中使用单元(具有需要内存分配的初始化部分)。OP认为他的代码必须在 FastMM 完成内存管理器后运行。如果在此之后分配内存,FastMM 会引发异常,因此禁止通过 RTL 分配内存。)


使用上一个问题中指出的 api 注册表函数或 Blorgbeard 对此问题的评论。结合前面的代码,它会变成这样:
var
  hReg: HKEY;
  Ret: Longint;
  RegDataType, RegDataSize: DWORD;
  CmdLine: array [0..560] of Char; // increase as needed
  Len: Integer;
  SInfo: TStartupInfo;
  PInfo: TProcessInformation;


initialization
$ifndef BCB
  // fastmm code
$endif

finalization
$ifndef PatchBCBTerminate
  FinalizeMemoryManager;  // fastmm code



  Ret := windows.RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                  'SOFTWARE\[YourProgram]', // registry key to your program's path
                  0, KEY_READ, hReg);

  RegDataType := REG_SZ;
  RegDataSize := 260;
  Ret := windows.RegQueryValueEx(hReg,
                  'path',       // registry value containing your program's path
                  nil, @RegDataType, @CmdLine, @RegDataSize);
  RegCloseKey(hReg);

  CmdLine[RegDataSize - 1] := ' ';
  CmdLine[RegDataSize] := '"';     // open doublequote in case spaces in path
  Len := windows.GetModuleFileName(0,
          PChar(@CmdLine[RegDataSize + 1]), 260) + RegDataSize;

  while CmdLine[Len] <> '.' do     // assumes executable has an extension
    Dec(Len);
  CmdLine[Len] := #0;
  lstrcat(CmdLine, '_MemoryManager_EventLog.txt"'#0);  // closing doublequote

  ZeroMemory(@SInfo, SizeOf(SInfo));
  SInfo.cb := SizeOf(SInfo);
  CreateProcess(nil, CmdLine, nil, nil, False,
                NORMAL_PRIORITY_CLASS, nil, nil, sInfo, pInfo);

$endif
end.

【讨论】:

以上是关于Delphi 7,使用FastMM4获取应用路径并打开应用的主要内容,如果未能解决你的问题,请参考以下文章

Delphi7 中使用FastMM 转载

线程关闭期间Win64 Delphi RTL中的内存泄漏?

fastmm4中文翻译

delphi项目程序输出编译成应用程序文件

如果用户的 PC 没有安装打印机,为啥 Delphi 7 应用程序会以“遇到问题并需要关闭”而退出?

Delphi 7 中使用 Paradox 实时 BMP 到 JPG 转换