DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: cuiqingbo
今日帖子: 19
在线用户: 11
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 q34625474 (q34625474) ★☆☆☆☆ -
盒子活跃会员
2014/10/30 21:02:11
标题:
如何得到一个EXE运行后的内存大小 浏览:2415
加入我的收藏
楼主: 想到得到一个EXE运行后的,内存有效最大基址

不知道怎么写了。。有知道的吗?
----------------------------------------------
delphi众人拾柴火焰高!支持盒子~~~~~~~~~~
作者:
男 q34625474 (q34625474) ★☆☆☆☆ -
盒子活跃会员
2014/10/30 22:20:55
1楼: 结贴。自己完成了...
----------------------------------------------
delphi众人拾柴火焰高!支持盒子~~~~~~~~~~
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2014/10/31 9:04:58
2楼: 不公开解决代码,应该是删帖。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2014/10/31 9:06:28
3楼: 不过,我还是给大家一个跨平台的吧。

  ///  <summary>
///    获取指定路径的总存储大小
///  </summary>
function GetTotalSpaceSize(Path: string = PathDelim): UInt64;
///  <summary>
///    获取指定路径的可以使用的存储大小
///  </summary>
function GetAvailableSpaceSize(Path: string = PathDelim): UInt64;
///  <summary>
///    获取指定路径的剩余(包括不可使用的)存储大小
///  </summary>
function GetFreeSpaceSize(Path: string = PathDelim): UInt64;

///  <summary>
///    获取总内存大小
{$IFDEF ANDROID}
///   感谢[上海]故国(370620516)
{$ENDIF}
///  </summary>
function GetTotalMemorySize: UInt64;
///  <summary>
///    获取剩余内存大小
{$IFDEF ANDROID}
///   感谢[上海]故国(370620516)
{$ENDIF}
///  </summary>
function GetFreeMemorySize: UInt64;
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2014/10/31 9:06:54
4楼: uses
{$IFDEF ANDROID}
{$IF CompilerVersion >= 27.0} // >= XE6
  Androidapi.Helpers,
{$ENDIF}
{$IF CompilerVersion < 28.0} // < XE7
  FMX.Helpers.Android,
{$ENDIF}
  Androidapi.Jni,
  Androidapi.JNI.Environment,
  Androidapi.JNI.StatFs,
  Androidapi.JNI.Stream2,
  Androidapi.JNI.ActivityManager,
  Androidapi.JNI.JavaTypes,
  Androidapi.NativeActivity,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.Util,
{$ENDIF}
{$IFDEF IOS or MACOS}
  iOSapi.Foundation,
  Macapi.ObjectiveC,
  FMX.Helpers.iOS,
//  iOSapi.UIDevice2,
{$ENDIF}
{$IFDEF MSWINDOWS}
  Winapi.Windows,
{$ENDIF}
//  FMX.Dialogs,
  System.Rtti,
  System.TypInfo,
  System.Math;
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2014/10/31 9:08:14
5楼: function GetTotalMemorySize: UInt64;
{$IFDEF IOS or MACOS}
begin
//  Result := TUIDevice2.Wrap(TUIDevice2.OCClass.currentDevice).totalMemory;
  Result := NSRealMemoryAvailable;
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
var
  lpBuffer : TMEMORYSTATUSEX;
begin
  Result := 0;
  ZeroMemory(@lpBuffer, Sizeof(TMEMORYSTATUSEX));
  lpBuffer.dwLength := Sizeof(TMEMORYSTATUSEX);
  GlobalMemoryStatusEx(lpBuffer);
  Result := lpBuffer.ullTotalPhys;
end;
{$ENDIF}
{$IFDEF ANDROID}
var
  Mgr: JActivityManager;
  MgrNative: JObject;
  MemInfo: JActivityManager_MemoryInfo;
  AStrings: TStringList;
  TempValue: string;
  AReader: JReader;
  ABufferedReader: JBufferedReader;
begin
  Result := 0;
  MgrNative := SharedActivityContext.getSystemService(TJContext.JavaClass.ACTIVITY_SERVICE);
  if Assigned(MgrNative) then
  begin
    Mgr := TJActivityManager.Wrap((MgrNative as ILocalObject).GetObjectID);
    MemInfo := TJActivityManager_MemoryInfo.JavaClass.init;
    Mgr.getMemoryInfo(MemInfo);
    try
      Result := UInt64(MemInfo.totalMem);
    except
      //API level < 16
      try
        Result := UInt64(MemInfo.availMem);
      except
        Result := 0;
      end;
      if FileExists('/proc/meminfo') then
      begin
        AStrings := TStringList.Create;
        try
          AStrings.LineBreak := sLineBreak;
          AStrings.NameValueSeparator := ':';
          AStrings.Clear;
          AReader := TJFileReader.JavaClass.init(StringToJString('/proc/meminfo')) as JReader;
          ABufferedReader := TJBufferedReader.JavaClass.init(AReader);
          repeat
          TempValue := JStringToString(ABufferedReader.readLine);
          if TempValue <> '' then
          begin
          AStrings.Add(TempValue);
          end;          until (not ABufferedReader.ready);
          ABufferedReader.close;
          TempValue := AStrings.Values['MemTotal'].Trim;
          AStrings.Clear;
          AStrings.NameValueSeparator := ' ';
          AStrings.Add(TempValue.Trim);
          TempValue := AStrings.Names[0];
//          ShowMessage(TempValue);
          Result := StrToInt64Def(TempValue, Result div 1024) * 1024;
        finally
          FreeAndNil(AStrings);
        end;
      end;
    end;
  end;
end;
{$ENDIF}

function GetFreeMemorySize: UInt64;
{$IFDEF IOS or MACOS}
begin
  //Result := Max(0, GetTotalMemorySize -
  //  TUIDevice2.Wrap(TUIDevice2.OCClass.currentDevice).userMemory);
  Result := NSRealMemoryAvailable;
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
var
  lpBuffer : TMEMORYSTATUSEX;
begin
  Result := 0;
  ZeroMemory(@lpBuffer, Sizeof(TMEMORYSTATUSEX));
  lpBuffer.dwLength := Sizeof(TMEMORYSTATUSEX);
  GlobalMemoryStatusEx(lpBuffer);
  Result := lpBuffer.ullAvailPhys;
end;
{$ENDIF}
{$IFDEF ANDROID}
var
  Mgr: JActivityManager;
  MgrNative: JObject;
  MemInfo: JActivityManager_MemoryInfo;
begin
  Result := 0;
  MgrNative := SharedActivityContext.getSystemService(TJContext.JavaClass.ACTIVITY_SERVICE);
  if Assigned(MgrNative) then
  begin
    Mgr := TJActivityManager.Wrap((MgrNative as ILocalObject).GetObjectID);
    MemInfo := TJActivityManager_MemoryInfo.JavaClass.init;
    Mgr.getMemoryInfo(MemInfo);
    try
      Result := UInt64(MemInfo.availMem);
    except
      Result := 0;
    end;
  end;
end;
{$ENDIF}

function GetTotalSpaceSize(Path: string = PathDelim): UInt64;
{$IFDEF IOS or MACOS}
var
  Dict: NSDictionary;
  P: Pointer;
const
  FoundationFwk: string = '/System/Library/Frameworks/Foundation.framework/Foundation';
begin
  Result := 0;
  if DirectoryExists(Path) or FileExists(Path) then
  begin
  end
  else
  begin
    raise Exception.Create('Path " ' + Path +  '" not found.');
  end;
  Dict := TNSFileManager.Wrap(TNSFileManager.OCClass.defaultManager).attributesOfFileSystemForPath(NSStr(Path), nil);
  if Dict = nil then
    Exit;
  P := Dict.objectForKey((CocoaNSStringConst(FoundationFwk, 'NSFileSystemSize') as ILocalObject).GetObjectID);
  if Assigned(P) then
    Result := TNSNumber.Wrap(P).unsignedLongLongValue;
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
var
  lpFreeBytesAvailableToCaller,
  lpTotalNumberOfBytes,
  lpTotalNumberOfFreeBytes: Int64;
begin
  Result := 0;
  if DirectoryExists(Path) or FileExists(Path) then
  begin
  end
  else
  begin
    raise Exception.Create('Path " ' + Path +  '" not found.');
  end;
  lpTotalNumberOfBytes := MaxInt;
  if GetDiskFreeSpaceEx(pchar(ExtractFileDrive(Path)),
    lpFreeBytesAvailableToCaller,
    lpTotalNumberOfBytes, @lpTotalNumberOfFreeBytes) then
  begin
    Result := UInt64(lpTotalNumberOfBytes);
  end;
end;
{$ENDIF}
{$IFDEF ANDROID}
var
  AJFile: JFile;
  AJStatFs: JStatFs;
begin
  Result := 0;
  if DirectoryExists(Path) or FileExists(Path) then
  begin
  end
  else
  begin
    raise Exception.Create('Path " ' + Path +  '" not found.');
  end;
  AJFile := TJFile.JavaClass.init(StringToJString(Path));
  if not Assigned(AJFile) then exit;
  AJStatFs := TJStatFs.JavaClass.init(AJFile.getPath);
  if not Assigned(AJStatFs) then exit;
  Result := UInt64(AJStatFs.getBlockSize) * UInt64(AJStatFs.getBlockCount);
end;
{$ENDIF}

function GetFreeSpaceSize(Path: string = PathDelim): UInt64;
{$IFDEF IOS or MACOS}
var
  Dict: NSDictionary;
  P: Pointer;
const
  FoundationFwk: string = '/System/Library/Frameworks/Foundation.framework/Foundation';
begin
  Result := 0;
  if DirectoryExists(Path) or FileExists(Path) then
  begin
  end
  else
  begin
    raise Exception.Create('Path " ' + Path +  '" not found.');
  end;
  Dict := TNSFileManager.Wrap(TNSFileManager.OCClass.defaultManager).attributesOfFileSystemForPath(NSStr(Path), nil);
  if Dict = nil then
    Exit;
  P := Dict.objectForKey((CocoaNSStringConst(FoundationFwk, 'NSFileSystemFreeSize') as ILocalObject).GetObjectID);
  if Assigned(P) then
    Result := TNSNumber.Wrap(P).unsignedLongLongValue;
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
var
  lpFreeBytesAvailableToCaller,
  lpTotalNumberOfBytes,
  lpTotalNumberOfFreeBytes: Int64;
begin
  Result := 0;
  if DirectoryExists(Path) or FileExists(Path) then
  begin
  end
  else
  begin
    raise Exception.Create('Path " ' + Path +  '" not found.');
  end;
  lpTotalNumberOfFreeBytes := MaxInt;
  if GetDiskFreeSpaceEx(pchar(ExtractFileDrive(Path)),
    lpFreeBytesAvailableToCaller,
    lpTotalNumberOfBytes, @lpTotalNumberOfFreeBytes) then
  begin
    Result := UInt64(lpTotalNumberOfFreeBytes);
  end;
end;
{$ENDIF}
{$IFDEF ANDROID}
var
  AJFile: JFile;
  AJStatFs: JStatFs;
begin
  Result := 0;
  if DirectoryExists(Path) or FileExists(Path) then
  begin
  end
  else
  begin
    raise Exception.Create('Path " ' + Path +  '" not found.');
  end;
  AJFile := TJFile.JavaClass.init(StringToJString(Path));
  if not Assigned(AJFile) then exit;
  AJStatFs := TJStatFs.JavaClass.init(AJFile.getPath);
  if not Assigned(AJStatFs) then exit;
  Result := UInt64(AJStatFs.getBlockSize) * UInt64(AJStatFs.getFreeBlocks);
end;
{$ENDIF}

function GetAvailableSpaceSize(Path: string = PathDelim): UInt64;
{$IFDEF IOS or MACOS}
begin
  Result := GetFreeSpaceSize(Path);
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
var
  lpFreeBytesAvailableToCaller,
  lpTotalNumberOfBytes,
  lpTotalNumberOfFreeBytes: Int64;
begin
  Result := 0;
  if DirectoryExists(Path) or FileExists(Path) then
  begin
  end
  else
  begin
    raise Exception.Create('Path " ' + Path +  '" not found.');
  end;
  lpFreeBytesAvailableToCaller := MaxInt;
  if GetDiskFreeSpaceEx(pchar(ExtractFileDrive(Path)),
    lpFreeBytesAvailableToCaller,
    lpTotalNumberOfBytes, @lpTotalNumberOfFreeBytes) then
  begin
    Result := UInt64(lpFreeBytesAvailableToCaller);
  end;
end;
{$ENDIF}
{$IFDEF ANDROID}
var
  AJFile: JFile;
  AJStatFs: JStatFs;
begin
  Result := 0;
  if DirectoryExists(Path) or FileExists(Path) then
  begin
  end
  else
  begin
    raise Exception.Create('Path " ' + Path +  '" not found.');
  end;
  AJFile := TJFile.JavaClass.init(StringToJString(Path));
  if not Assigned(AJFile) then exit;
  AJStatFs := TJStatFs.JavaClass.init(AJFile.getPath);
  if not Assigned(AJStatFs) then exit;
  Result := UInt64(AJStatFs.getBlockSize) * UInt64(AJStatFs.getAvailableBlocks);
end;
{$ENDIF}
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2014/10/31 9:16:38
6楼: 以上代码来自
https://sourceforge.net/p/fmxflyfilesutils
----------------------------------------------
(C)(P)Flying Wang
作者:
男 littley (y) ★☆☆☆☆ -
普通会员
2014/10/31 13:06:26
7楼: 谢谢6楼的兄弟
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2014/10/31 13:34:12
8楼: 好像我发的和楼主的需要不一样。

楼主要的是最大基址。

这个我没有研究过。

希望,楼主说说解决办法。

否则楼主还有脸 来这个论坛吗?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wuxi15 (似水·流年) ▲▲▲▲▲ -
普通会员
2014/10/31 18:25:40
9楼: 楼主也许己经把代码像宝一样藏起来了。当然,也许是我误会了,他是没有来论坛,没有看到楼上的建议
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS