论坛风格切换切换到宽版
  • 448阅读
  • 5回复

请老虎版主及教高手们,inno setup  制作的安装补丁路径设置问题 [复制链接]

上一主题 下一主题
离线wsyql123123
 

发帖
9
金钱
90
威望
9
只看楼主 倒序阅读 0 发表于: 2011-12-15
请问,我想实现的是:能够通过下面脚本检测目前注册表中是否有(HKEY_LOCAL_MACHINE, 'SOFTWARE\TouchDev\touchdev\1.00.000') 和(HKEY_LOCAL_MACHINE, 'SOFTWARE\Free Interactive Technology\fitouch\1.00.000')之中的一个存在。如有的话,那么就将Gallery补丁安装在该程序目前所在的目录下,但是通过下面的代码中,只能实现将其安装在  C:\Program Files\Gallery中,请问下面的脚本是DefaultDirName的路径没定义好,还是code段中的代码有问题?如何实现啊?希望高手们指点指点!(查过论坛中的帖子,但目前安装路径问题依然解决不了)
[Setup]
AppId={{6260B099-DFBE-4ACE-968B-9392640AA073}
AppName=Gallery
AppVersion=1.0
DefaultDirName={code:GetPath}            
DefaultGroupName=Gallery
OutputDir=C:\Users\IBM\Desktop
OutputBaseFilename=Gallery
Compression=lzma
SolidCompression=yes
Uninstallable = no
[Languages]
Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"
[Files]
Source: "C:\Users\IBM\Desktop\Gallery\Gallery\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
[code]
function ShouldSkipPage(PageID: Integer): Boolean;
begin
result := false;
if PageID = wpSelectDir then result := true;
end;
function InitializeSetup(): Boolean;
begin
  Result := true;
if not (RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\TouchDev\touchdev\1.00.000') or RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Free Interactive Technology\fitouch\1.00.000')) then
  begin
  MsgBox('未检测到原安装程序,请先安装!', mbInformation, MB_OK);
  Result := False;
end;
end;
function GetPath(Param: String): String;
var
  strPath: String;
begin
    strPath := ExpandConstant('{pf}\Gallery');
  if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\TouchDev\touchdev\1.00.000', 'Path', strPath) then
  begin
        strPath := ExtractFilePath(strPath);
  end;
  
  if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Free Interactive Technology\fitouch\1.00.000', 'Path', strPath) then
  begin
        strPath := ExtractFilePath(strPath);
  end;
  Result := strPath;
end;
离线gnatix

发帖
6912
金钱
7500
威望
750
只看该作者 1 发表于: 2011-12-16
代码本身没有问题。
如果注册表中 Path 的值本身就是一个路径的话,那么不应该再用 ExtractFilePath 提取了。
能不能给一个 Path 值的例子?
离线wsyql123123

发帖
9
金钱
90
威望
9
只看该作者 2 发表于: 2011-12-16
不好意思,我不确定您要的是不是安装路径的值:我想实现的就是检测C:\Free Interactive Technology\fitouch和C:\TouchDev\touchdev两个路径有一个存在(这两个路径也可安装在其他盘中),那么就将Gallery.exe安装在检测到的路径下,但上面的脚本代码只能判断是否没有安装两个中的一个,不能将Gallery按照检测到的路径来安装,请指示!


老虎版主,我感觉这句代码有问题,strPath := ExpandConstant('{pf}\Gallery'),我想应该是它致使Gallery安装在了c:\program Files里面了,但又不知道怎么解决。
离线gnatix

发帖
6912
金钱
7500
威望
750
只看该作者 3 发表于: 2011-12-17
strPath := ExpandConstant('{pf}\Gallery') 只是给变量赋予一个初始值而已,如果注册表中读取到了 Path 里面的值,那个初始值反正会被覆盖的。
如果最后的安装目录还是 ExpandConstant('{pf}\Gallery') ,说明读取注册表失败。你再检查一下代码中的注册表项的名称与实际的名称是否一致。
另外,建议用下面的代码:
  1. function GetPath(Param: String): String;
  2. var
  3.   strPath: String;
  4. begin
  5.   Result := ExpandConstant('{pf}\Gallery');
  6.   if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\TouchDev\touchdev\1.00.000', 'Path', strPath) then
  7.   begin
  8.     Result := strPath;
  9.     Exit;
  10.   end;
  11.   if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Free Interactive Technology\fitouch\1.00.000', 'Path', strPath) then
  12.     Result := strPath;
  13. end;


离线wsyql123123

发帖
9
金钱
90
威望
9
只看该作者 4 发表于: 2011-12-19
谢谢啦!真的是注册表的问题,万分的佩服!
离线信缘lzy

发帖
6
金钱
20
威望
2
只看该作者 5 发表于: 01-14
过来学习下啦!