论坛风格切换切换到宽版
  • 11858阅读
  • 17回复

[求助]请问用INNO制作安装包,限制安装路径的方法 [复制链接]

上一主题 下一主题
离线duskymagus
 
发帖
178
金钱
100
威望
10
只看楼主 倒序阅读 0 发表于: 2011-01-27
因为程序不能运行在含有空格的路径下。所以安装包需要限制安装路径。
或者有一个勉强方案,让用户只能选择盘符不能选择具体路径。

搜索到http://bbs.hanzify.org/read-htm-tid-58533.html这个帖子。不能实现。
代码有错,
修改此处
n := n + 1;
      end

        drivesletters := Copy( drivesletters, posnull+1, Length(drivesletters));

n := n + 1;
      end;

        drivesletters := Copy( drivesletters, posnull+1, Length(drivesletters));
安装程序会陷入死循环。

请各位帮忙
离线duskymagus
发帖
178
金钱
100
威望
10
只看该作者 1 发表于: 2011-01-27
老虎哥和阿信捏
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 2 发表于: 2011-01-27
那个代码没有错,不需要修改,直接编译就可以了。
离线duskymagus
发帖
178
金钱
100
威望
10
只看该作者 3 发表于: 2011-01-27
Hi老虎哥 可是如果不修改代码 会提示这里出错
离线duskymagus
发帖
178
金钱
100
威望
10
只看该作者 4 发表于: 2011-01-27
在Error处 添加 ";"
然后 将
GetLogicalDriveStringsA
修改为
GetLogicalDriveStringsW
不会选入死循环了。

再请问,GetLogicalDriveStringsW是Unocide专用的对吗。
如果在Windows 98上运行安装程式 会出现问题吗?
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 5 发表于: 2011-01-27
你用的什么 INNO 版本?
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 6 发表于: 2011-01-27
要不你试试这个:
[Setup]AppName=我的软件AppVerName=我的软件版本 1.5DefaultDirName=XXXDefaultGroupName=我的软件Compression=lzmaSolidCompression=trueDisableProgramGroupPage=trueUsePreviousGroup=falseShowLanguageDialog=noOutputBaseFilename=drivesOnly[Files]Source: feature.txt; DestDir: {app}[Messages]SelectDirBrowseLabel=若要继续,单击下一步。如果您希望选择另一个驱动,请在列表中选择。[Code]var    // 驱动勾选    cbDrive : TComboBox;    // 保持驱动器号的字符串的数组    DrvLetters: array of String;function GetDriveType( lpDisk: String ): Integer;external 'GetDriveTypeA@kernel32.dll stdcall';function GetLogicalDriveStrings( nLenDrives: LongInt; lpDrives: String ): Integer;external 'GetLogicalDriveStringsA@kernel32.dll stdcall';const  DRIVE_UNKNOWN = 0; // 驱动类型无法断定  DRIVE_NO_ROOT_DIR = 1; // 根目录无效。例如没有任何卷已挂载于目录。DRIVE_REMOVABLE = 2; // 磁盘可以从驱动中移除  DRIVE_FIXED = 3; // 磁盘不能从驱动中移除  DRIVE_REMOTE = 4; // 驱动是个远程 (网络) 驱动。  DRIVE_CDROM = 5; // 这是一个 CD-ROM 驱动。  DRIVE_RAMDISK = 6; // 这是一个 RAM 驱动。// 要将磁盘类型转换为字符串的函数function DriveTypeString( dtype: Integer ): String;begin  case dtype of    DRIVE_NO_ROOT_DIR : Result := 'Root path invalid';    DRIVE_REMOVABLE : Result := 'Removable';    DRIVE_FIXED : Result := 'Fixed';    DRIVE_REMOTE : Result := 'Network';    DRIVE_CDROM : Result := 'CD-ROM';    DRIVE_RAMDISK : Result := 'Ram disk';  else    Result := 'Unknown';  end;end;// 更改文件夹依照所选的驱动字母procedure cbDriveOnClick(Sender: TObject);begin    WizardForm.DirEdit.Text := DrvLetters[ cbDrive.ItemIndex ] + UpperCase(ExpandConstant('ABC\XYZ\123'));     // 要添加的文件夹end;procedure FillCombo();var  n: Integer;  drivesletters: String; lenletters: Integer;  drive: String;  disktype, posnull: Integer;  sd: String;begin  //get the system drive  sd := UpperCase(ExpandConstant('{sd}'));  //get all drives letters of system  drivesletters := StringOfChar( ' ', 64 );  lenletters := GetLogicalDriveStrings( 63, drivesletters );  SetLength( drivesletters , lenletters );  drive := '';  n := 0;  while ( (Length(drivesletters) > 0) ) do  begin    posnull := Pos( #0, drivesletters );      if posnull > 0 then      begin      drive:= UpperCase( Copy( drivesletters, 1, posnull - 1 ) );      // 获取磁盘的号码类型      disktype := GetDriveType( drive );      // 如果不是软盘才添加      if ( not ( disktype = DRIVE_REMOVABLE ) ) then      begin            cbDrive.Items.Add( drive + '   [' + DriveTypeString( disktype ) + ']' )        SetArrayLength(DrvLetters, N+1);        DrvLetters[n] := drive;        // 默认选择 C: 驱动        //if ( Copy(drive,1,2) = 'C:' ) then cbDrive.ItemIndex := n;        // or default to system drive        if ( Copy(drive,1,2) = sd ) then cbDrive.ItemIndex := n;        n := n + 1;      end;        drivesletters := Copy( drivesletters, posnull+1, Length(drivesletters));      end;  end;  cbDriveOnClick( cbDrive );end;procedure InitializeWizard();begin    // 创建驱动的勾选框    cbDrive:= TComboBox.Create(WizardForm.SelectDirPage);    with cbDrive do    begin      Parent := WizardForm.DirEdit.Parent;      Left := WizardForm.DirEdit.Left;      Top := WizardForm.DirEdit.Top + WizardForm.DirEdit.Height * 2;      Width := WizardForm.DirEdit.Width;      Style := csDropDownList;    end;    // 隐藏浏览按钮    WizardForm.DirBrowseButton.Visible := false;    // 文件夹的编辑框不必作为可编辑    WizardForm.DirEdit.Enabled := false;    //使用驱动填满勾选框    FillCombo;    // 设置事件当勾选出现变化    cbDrive.OnClick := @cbDriveOnClick;end;

离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 7 发表于: 2011-01-27
离线duskymagus
发帖
178
金钱
100
威望
10
只看该作者 8 发表于: 2011-01-28
虎哥 我用的是 5.4.0 unicode 版本。 ISPP 5.3.9 unicode 版本。
系统是windows 7.
必须要将
GetLogicalDriveStringsA
修改为
GetLogicalDriveStringsW

才不会陷入死循环。否则安装程序会卡住。
离线duskymagus
发帖
178
金钱
100
威望
10
只看该作者 9 发表于: 2011-01-28
虎哥 我下载了非unicode版本的inno
用你的脚本没问题了。

那请问 具体的差别在什么地方 关于unicode和非unicdoe

为了兼容性 我应该用非unicode版本的对吗?