论坛风格切换切换到宽版
  • 3157阅读
  • 11回复

请教老虎版主修正,获取内存大小脚本 [复制链接]

上一主题 下一主题
离线546242502
 

发帖
332
金钱
-3060
威望
-306
只看楼主 倒序阅读 0 发表于: 2015-08-16



能编译,但是如上图所示,可能哪里不对,请教老虎版主修正?

代码:
; ISX 3.0.2
;
; Setup can continue if available physical memory is bigger than 32
;
[Setup]
AppName=PhysMem
AppVerName=PhysMem
Uninstallable=false
UpdateUninstallLogAppName=false
DisableDirPage=true
DisableProgramGroupPage=true
DefaultDirName={pf}\PhysMem
DisableStartupPrompt=true

[_ISTool]
EnableISX=true


[Code]

type
  TMemoryStatus = record
    dwLength : Longint;
    dwMemoryLoad : Longint;
    dwTotalPhys : Longint;
    dwAvailPhys : Longint;
    dwTotalPageFile : Longint;
    dwAvailPageFile : Longint;
    dwTotalVirtual : Longint;
    dwAvailVirtual : Longint;
  end;

procedure GlobalMemoryStatus(var lpBuffer: TMemoryStatus); external
'GlobalMemoryStatus@kernel32.dll';


function InitializeSetup: Boolean;
var
  M: TMemoryStatus;
  s, crlf: string;
  oneMB: Longint;
begin

  crlf := #13#10;
  oneMB := 1024 * 1024;

  GlobalMemoryStatus(M);

  s := 'Phisical Memory is : ' + IntToStr( M.dwTotalPhys / oneMB ) + ' MByte' +
  crlf + 'Available Memory is : ' + IntToStr( M.dwAvailPhys / oneMB ) + ' MByte';

  MsgBox( s ,mbInformation, MB_OK );

  // it's ok if Availanle Phisical memory is bigger than 32 MB
  Result := ( M.dwAvailPhys / oneMB ) >= 32;

  if ( not Result ) then
    MsgBox( 'Not enough memory' , mbError, MB_OK );

end;
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 1 发表于: 2015-08-16

还有就是请教下将注册表键值下入INI问题
读取HKLM\SOFTWARE\Microsoft\Windows\Internet   Settings\5.0\UserAgent
中的UserAgent的键值,并通过INI功能写入到一个INI文件中,该怎么做?

------------------------------------>>
[INI]
Filename: "{app}\MyProg.ini"; Section: "ABCDEFG"; Key: "UserAgent"; String: "{reg:HKLM\SOFTWARE\Microsoft\Windows\Internet Settings\5.0\UserAgent,}"

我一直没写入成功过,我的代码如下:

[INI]
Filename: "{app}\MyProg.ini"; Section: "7-Zip"; Key: "Path64"; String: "{reg:HKU\Software\7-Zip,}"
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 2 发表于: 2015-08-16
关于内存的问题,我看不出代码有什么问题。

关于读取注册表中键值到 INI 文件的问题,你没有给出键名,所以正确应该是
[INI]
Filename: "{app}\MyProg.ini"; Section: "ABCDEFG"; Key: "UserAgent"; String: "{reg:HKLM\SOFTWARE\Microsoft\Windows\Internet Settings\5.0\UserAgent, UserAgent}"
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 3 发表于: 2015-08-17
回 2楼(gnatix) 的帖子
老虎版主,试了一下你说的方法,还是不行:
注册表内容:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip]
"Path64"="C:\\Program Files\\7-Zip\\"
"Path"="C:\\Program Files\\7-Zip\\"

脚本内容:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DisableProgramGroupPage=yes

[INI]
Filename: "{app}\MyProg.ini"; Section: "7-Zip"; Key: "Path64"; String: "{reg:HKLM\SOFTWARE\7-Zip,Path64}"

但是写入的内容只是这样:

[7-Zip]
Path64=
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 4 发表于: 2015-08-17
回 2楼(gnatix) 的帖子
gnatix:关于内存的问题,我看不出代码有什么问题。关于读取注册表中键值到 INI 文件的问题,你没有给出键名,所以正确应该是Filename: "{app}\MyProg.ini"; Section: "ABCDEFG"; Key: "UserAgent&quo .. (2015-08-16 23:59) 

老虎版主,顺便您可以通过下面的修正下获取内存的代码么:
http://www.delphitop.com/html/neicun/1314.html
http://my.oschina.net/pc100/blog/380020
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 5 发表于: 2015-08-17
注册表的问题是这样的:
你可能是在 64 位系统。在 64 位系统下 {reg:HKLM\SOFTWARE\7-Zip,Path64} 会被解析为 32 位应用程序相应的注册表位置,即:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\7-Zip

但是看你提供的注册表信息,知道你的注册表位置直接就是 64 位应用程序的位置,即
HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip
那么你就要用
{reg:HKLM64\SOFTWARE\7-Zip,Path64}

所以正确应该是
[INI]
Filename: "{app}\MyProg.ini"; Section: "7-Zip"; Key: "Path64"; String: "{reg:HKLM64\SOFTWARE\7-Zip,Path64}"
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 6 发表于: 2015-08-17
请参看帮助文件中有关 32 位和 64 位应用程序的内容。
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 7 发表于: 2015-08-17
检查内存的代码应该是没有问题的,估计是超出了 LongInt 的范围了。你试试下面的代码看看。

; ISX 3.0.2
;
; Setup can continue if available physical memory is bigger than 32
;
[Setup]
AppName=PhysMem
AppVerName=PhysMem
Uninstallable=false
UpdateUninstallLogAppName=false
DisableDirPage=true
DisableProgramGroupPage=true
DefaultDirName={pf}\PhysMem
DisableStartupPrompt=true

[_ISTool]
EnableISX=true

[Code]

type
  TMemoryStatus = record
    dwLength :  DWORD;
    dwMemoryLoad :  DWORD;
    dwTotalPhys : Cardinal;
    dwAvailPhys : Cardinal;
    dwTotalPageFile : Cardinal;
    dwAvailPageFile : Cardinal;
    dwTotalVirtual : Cardinal;
    dwAvailVirtual : Cardinal;
  end;

procedure GlobalMemoryStatus(var lpBuffer: TMemoryStatus); external
'GlobalMemoryStatus@kernel32.dll';

function InitializeSetup: Boolean;
var
  M: TMemoryStatus;
  s, crlf: string;
  oneMB: Longint;
begin

  crlf := #13#10;
  oneMB := 1024 * 1024;

  GlobalMemoryStatus(M);

  s := 'Phisical Memory is : ' + IntToStr( M.dwTotalPhys / OneMB) + ' MByte' +
  crlf + 'Available Memory is : ' + IntToStr( M.dwAvailPhys / OneMB) + ' MByte';

  MsgBox( s ,mbInformation, MB_OK );

  // it's ok if Availanle Phisical memory is bigger than 32 MB
  Result := ( M.dwAvailPhys / oneMB ) >= 32;

  if ( not Result ) then
    MsgBox( 'Not enough memory' , mbError, MB_OK );

end;
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 8 发表于: 2015-08-17
回 7楼(gnatix) 的帖子
老虎版主,好像不适用于64位系统

离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 9 发表于: 2015-08-17
回 5楼(gnatix) 的帖子
gnatix:注册表的问题是这样的:你可能是在 64 位系统。在 64 位系统下 {reg:HKLM\SOFTWARE\7-Zip,Path64} 会被解析为 32 位应用程序相应的注册表位置,即:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\7-Zip但是看你提供的注 .. (2015-08-17 02:05) 

老虎版主,这次终于正确了