论坛风格切换切换到宽版
  • 6036阅读
  • 7回复

請問 Inno Setup 如何 在xml文件中增加一個項目? [复制链接]

上一主题 下一主题
离线sidelee72
 

发帖
29
金钱
290
威望
29
只看楼主 倒序阅读 0 发表于: 2011-05-26
请问该如何使用 Inno Setup 在指定的xml文件中增加一个项目?
想请教版主
我知道有"CodeAutomation.iss"可以参考
但是,我找不到可以增加项目的方法

大概是如下这样的XML文件
<Base.Document>
   <Launch.Addon>
       <Name>MY DLL.DLL</Name>
   </Launch.Addon>
</Base.Document>


==>>>增加一个项目

<Base.Document>
   <Launch.Addon>
       <Name>MY DLL.DLL</Name>
   </Launch.Addon>
   <Launch.Addon>
       <Name>MY DLL2.DLL</Name>
   </Launch.Addon>
</Base.Document>

离线nan2009

发帖
13
金钱
130
威望
13
只看该作者 1 发表于: 2011-05-27
NSIS有XML的插件,或者用文本方法将字符串插进指定位置。
离线xwhminghan

发帖
263
金钱
1440
威望
144
只看该作者 2 发表于: 2011-05-27
var
  xmlFile, OldString, NewString: string;
  xmlFileLines: TArrayOfString;
  i: Integer;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if (CurStep = ssDone) and (IsComponentSelected('Storm')) then
    begin
      xmlFile:= ExpandConstant('{commonappdata}\Storm\config.xml'); // 你的 xml 文件名
      OldString:='C:\Program Files\StormII'; // 要替换的旧字符串
      NewString:= ExpandConstant('{app}'); // 新字符串
       //以下开始替换字符串
      LoadStringsFromFile(xmlFile, xmlFileLines);
      for i:= 0 to GetArrayLength(xmlFileLines)-1 do
      if (Pos(OldString, xmlFileLines[*i]) > 0) then
        StringChangeEx(xmlFileLines[*i], OldString, NewString, true);   //支持双字节字符集(DBCS)
        SaveStringsToFile(xmlFile, xmlFileLines, False);
    end;
end;
呵呵,很囧,我本人没有学过计算机语言之类的课程,而我学习打包软件,完全处于自己的兴趣而已,Inno Setup 也只是学习了几个月,NSIS 也只是接触一点点,对于Pascal语言,没有一个系统的了解,因此还很陌生,还望大虾们以后多多赐教,表笑我啊~~
离线xwhminghan

发帖
263
金钱
1440
威望
144
只看该作者 3 发表于: 2011-05-27
文本文件 123.txt 的内容:

; 所有不含等号的行都是注释行,不会被处理
Name = "PRO",
# 这行不会处理
Nember = "123",
Company = "PILI",

Score = 100,
Time = 10,


See = 5,
Look = 0,



[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Files]
Source: 123.txt; DestDir: {app}

[Code]
procedure WriteTxt2Registry(TextFilePath: string; RootKey: Integer; SubKeyName: String);
Var
   valuename, value: String;
   i: Integer;
   s: String;
   aos: TArrayOfString;
begin
if FileExists(TextFilePath) then    // 检查文件是否存在
   begin
   LoadStringsFromFile(TextFilePath, aos);  // 读入文件内容
   for i := 0 to GetArrayLength(aos) - 1 do   // 处理每一行文本
     if Pos('=', aos) <> 0 then      // 只处理有等号“=”的行
       begin
       s := Trim(aos);
       valuename := Trim(copy(s, 1, pos('=',s)-1)); // 等号前面的部分作为键值名称
       value := Trim(copy(s, pos('=',s)+1, Length(s)-pos('=',s)-1)); // 等号后面的部分作为键值,不包括最后的逗号
       if pos('"', value) = 0 then     // 检查值中是否有双引号
         RegWriteDWordValue(RootKey, Subkeyname, valuename, StrToIntDef(value, 0))   // 写入数字值
       else
         RegWriteStringValue(RootKey, Subkeyname, valuename, copy(value, 2, Length(value)-2));    // 写入字符值,不包括引号
       end;
   end;
end;

function NextButtonClick ( CurPageID : Integer): Boolean;
begin
result := true;
if CurPageID = wpFinished then   // 点击“下一步”后执行
   WriteTxt2Registry(ExpandConstant('{app}\123.txt'), HKEY_CURRENT_USER, 'Software\My Company\My Software');
end;

请楼主学会google或者baidu
呵呵,很囧,我本人没有学过计算机语言之类的课程,而我学习打包软件,完全处于自己的兴趣而已,Inno Setup 也只是学习了几个月,NSIS 也只是接触一点点,对于Pascal语言,没有一个系统的了解,因此还很陌生,还望大虾们以后多多赐教,表笑我啊~~
离线sidelee72

发帖
29
金钱
290
威望
29
只看该作者 4 发表于: 2011-05-28
xwhminghan 大哥
不好意思
在发文前我已经整整翻了一天的google
还是没找到我可以理解的方法
所以才发文求救

而你提供的第一种方法
用途似乎是取代字串
不是插入另一个新的项目

第二个123.txt
没办法在我的Inno上编译
试了几个版本都失败

请教求解了
离线sidelee72

发帖
29
金钱
290
威望
29
只看该作者 5 发表于: 2011-05-28
我有找到一个控制xml文件的 XMLExample
但一样发生错误
看起来是该script有点问题
请大家研究看看~!
谢谢喽
附件: 23_XML_v.1.0.rar (3 K) 下载次数:5
离线xwhminghan

发帖
263
金钱
1440
威望
144
只看该作者 6 发表于: 2011-05-29
回 5楼(sidelee72) 的帖子
我发的脚本,因为论坛编码的问题,里面的[i*](去掉*)可能没有了,请注意改过来。另外你发的脚本可以编译,请使用restools的增强版。


第一个脚本,你不会先在你要修改的地方,写上你自己的特定内容,然后安装的时候替换吗?第二个脚本,请下载这个吧或者在论坛搜索。 把文本文件中的内容写入到注册表.rar (2 K) 下载次数:5
呵呵,很囧,我本人没有学过计算机语言之类的课程,而我学习打包软件,完全处于自己的兴趣而已,Inno Setup 也只是学习了几个月,NSIS 也只是接触一点点,对于Pascal语言,没有一个系统的了解,因此还很陌生,还望大虾们以后多多赐教,表笑我啊~~
离线sidelee72

发帖
29
金钱
290
威望
29
只看该作者 7 发表于: 2011-05-30
xwhminghan兄
老实说,我不懂你所说的意思
替换? 是指直接替换档案吗?
而第二个脚本,我并没有要把文本内容写进注册表阿....???

23_XML_v.1.0.rar 我换了几个版本的inno setup都无法正常执行,包括restools增强版
请问您可以正常执行的版本是?