0

私は sourceforge.net の を使用するアプリケーションに取り組んでFastMM4ますFastMM4.pasそのため、最初の uses 句に を追加しました。アプリケーションでは、このようなの後にbatchファイルを実行する必要がありますFinalizeMemoryManager;finalizationunit FastMM4;

  initialization
        RunInitializationCode;

  finalization
        {$ifndef PatchBCBTerminate}
        FinalizeMemoryManager;
        RunTheBatFileAtTheEnd; //my code here..calling a procedure
       {$endif}

 end.

RunTheBatFileAtTheEndの私のコードは次のとおりです。

 procedure RunTheBatFileAtTheEnd;
 begin
 //some code here....
  sFilePaTh:=SysUtils.ExtractFilePath(applicaTname)+sFileNameNoextension+'_log.nam';
 ShellExecute(applcatiOnHAndle,'open', pchar(sExeName),pchar(sFilePaTh), nil, SW_SHOWNORMAL) ;
 end;

このためSysUtils,shellapiに、fastmm4 ユニットの uses 句で使用する必要があります。しかし、それらを使用すると、このメッセージが表示されます ここに画像の説明を入力

しかし、使用から削除SysUtils,shellapiすると機能します。まだ fastmm4 のすべての機能をインストールする必要がありますがSysUtils,shellapi、fastmm4 はインストールされていません。

私は自分のユニットを持っていますが、そのファイナライズは fastmm4 のファイナライズの前に実行されます。

誰でもこの問題を解決する方法を教えてもらえますか?

編集-1

unit FastMM4;
//...
...
implementation

 uses
   {$ifndef Linux}Windows,{$ifdef FullDebugMode}{$ifdef Delphi4or5}ShlObj,{$else}
  SHFolder,{$endif}{$endif}{$else}Libc,{$endif}FastMM4Messages,SysUtils,shellapi;

私のアプリケーション

 program memCheckTest;
   uses
      FastMM4,

EDIT-2 :

(@SertacAkyuzの回答後)、削除SysUtilsして機能しましたが、バッチファイルを実行して外部アプリケーションを開く必要がありますRunTheBatFileAtTheEnd. 理由は..FastMM4がfinalization. sExeNameファイルsFilePaTh(.nam)を実行するアプリケーションです。誰でもこれを行う方法を教えてもらえますか? なしuninstalling FastMM4

4

2 に答える 2

5

IsMemoryManagerSetFastMMは、デフォルトのメモリマネージャが設定されているかどうかを確認してから、'system.pas'の関数を呼び出して独自のメモリマネージャをインストールします。デフォルトのメモリマネージャが設定されている場合、独自のメモリマネージャの設定を拒否し、質問に示されているメッセージを表示します。

'fastmm4.pas'に関するそのメッセージの指示は、プロジェクトの.dprファイルの最初のユニットである必要があります。'fastmm4.pas'自体は変更されていないことを前提としています。

'fastmm4.pas'のuses句を変更する場合、uses句に含まれるユニットのいずれかにinitializationセクションがある場合、コードのそのセクションは'fastmm4.pas'の初期化セクションの前に実行する必要があります。そのコードがRTLを介したメモリの割り当て/課金を必要とする場合、デフォルトのメモリマネージャが設定されます。

したがって、「sysutils.pas」のように、uses句にそのようなユニットが含まれないように「fastmm4.pas」を変更するように注意する必要があります。


以下のサンプルコード(エラーチェックなし、ファイルチェックなど)は、メモリを割り当てずにメモ帳でFastMMのログファイルを起動する方法を示しています(ログファイルが存在する場合)。

var
  CmdLine: array [0..300] of Char; // increase as needed
  Len: Integer;
  SInfo: TStartupInfo;
  PInfo: TProcessInformation;

initialization
  ...  // fastmm code

finalization
{$ifndef PatchBCBTerminate}
  FinalizeMemoryManager;       // belongs to fastmm

  // Our application is named 'Notepad' and the path is defined in AppPaths
  CmdLine := 'Notepad "';  // 9 Chars (note the opening quote)
  Len := windows.GetModuleFileName(0, PChar(@CmdLine[9]), 260) + 8;

  // assumes the executable has an extension.
  while CmdLine[Len] <> '.' do
    Dec(Len);

  CmdLine[Len] := #0;
  lstrcat(CmdLine, '_MemoryManager_EventLog.txt"'#0); // note the closing quote

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

{$endif}

end.
于 2012-05-28T13:35:43.127 に答える
1

私はSertacの答えに同意しますが、使用を主張する場合は、推奨もしたいと思いますSysUtils.pas. 答えは、それを使用せず、そこから必要なものを抽出して、独自のコピーに入れることです。以下に必要なものを示します- ExtractFilePathused LastDeliminator、 used StrScan、および 2 つの定数があるため、それらをこの新しいユニットにコピーして名前を付けましたMySysUtils.pas

これは、決して使用しない余分なコードをコンパイルしたくない人にも広く使用されています (ただし、どのユニットでも使用されていないことを絶対に確認する必要があります)。

unit MySysUtils;

interface

const
  PathDelim = '\';
  DriveDelim = ':';

implementation

function StrScan(const Str: PWideChar; Chr: WideChar): PWideChar;
begin
  Result := Str;
  while Result^ <> #0 do begin
    if Result^ = Chr then
      Exit;
    Inc(Result);
  end;
  if Chr <> #0 then
    Result := nil;
end;

function LastDelimiter(const Delimiters, S: string): Integer;
var
  P: PChar;
begin
  Result := Length(S);
  P := PChar(Delimiters);
  while Result > 0 do begin
    if (S[Result] <> #0) and (StrScan(P, S[Result]) <> nil) then
      Exit;
    Dec(Result);
  end;
end;

function ExtractFilePath(const FileName: string): string;
var
  I: Integer;
begin
  I := LastDelimiter(PathDelim + DriveDelim, FileName);
  Result := Copy(FileName, 1, I);
end;

end.
于 2012-05-29T08:55:45.870 に答える