InstallShield 操作XML是用的DOM文档对象模型,这东西就比较好弄了。
prototype CreateXml(STRING);
prototype DelteXmlNode(STRING);
prototype UpdateXmlNode(STRING);
prototype InsertXmlNode(STRING);
//创建一个XML文档
function CreateXml(szFile)
OBJECT objXml;
STRING strXML;
begin
//开始创建XML文档
set objXml = CreateObject("MSXML.DOMDocument");//创建一个DOM对象
if (IsObject(objXml) = FALSE ) then
MessageBox("出错,系统不支持使用DOM对象",SEVERE);
endif;
objXml.async = FALSE;
///r/n是回车换行 让内容更美观点 呵呵
strXML = "<?xml version=/"1.0/" encoding=/"utf-8/" ?>/r/n"
+ "<INVENTORY>/r/n"
+"<BOOK><TITLE src =/"www/">One</TITLE><PRICE>1.0</PRICE></BOOK>/r/n"
+"<BOOK><TITLE>Two</TITLE><PRICE>2.0</PRICE></BOOK>/r/n"
+"<BOOK><TITLE>Three</TITLE><PRICE>3.0</PRICE></BOOK>/r/n"
+"</INVENTORY>/r/n";
objXml.loadXML(strXML);//可以用片段很容易就弄一个XML文档出来
objXml.save(szFile); //保存
set objXml = NOTHING;
end;
//插入一个节点值
function InsertXmlNode(szFile)
OBJECT objXml;
OBJECT objRoot,objNode;
OBJECT objBook,objTitle,objAttributeNode;
begin
set objXml = CreateObject("MSXML.DOMDocument");//创建一个DOM对象
if (IsObject(objXml) = FALSE ) then
MessageBox("出错,系统不支持使用DOM对象",SEVERE);
endif;
objXml.async = FALSE;
objXml.load(szFile);//加载原有XML文档
set objRoot = objXml.documentElement; //取根节点
set objBook = objXml.CreateElement("BOOK");
//objBook.text = "Free";
set objTitle = objXml.CreateElement("TITLE");
objTitle.text = "4";
set objAttributeNode = objXml.CreateNode("attribute","src","");
objAttributeNode.text = "ww";
objTitle.SetAttributeNode(objAttributeNode); //添加属性节点
objBook.appendChild(objTitle);
objRoot.appendChild(objBook); //添加节点
objXml.save(szFile); //保存
set objBook = NOTHING;
set objTitle = NOTHING;
set objXml = NOTHING;
end;
//更新某个节点值
function UpdateXmlNode(szFile)
OBJECT objXml;
OBJECT objRoot,objNode;
begin
set objXml = CreateObject("MSXML.DOMDocument");//创建一个DOM对象
if (IsObject(objXml) = FALSE ) then
MessageBox("出错,系统不支持使用DOM对象",SEVERE);
endif;
objXml.async = FALSE;
objXml.load(szFile);//加载原有XML文档
set objRoot = objXml.documentElement; //取根节点
//MessageBox(objRoot.xml,SEVERE); //输出所有节点测试
set objNode = objRoot.selectSingleNode("BOOK/TITLE");//查找TITLE节点
//MessageBox(objNode.text,SEVERE); //输出他的值
objNode.text = "Hello";//改变值
objXml.save(szFile); //保存
set objNode = NOTHING;
set objXml = NOTHING;
end;
//删除某个节点
function DelteXmlNode(szFile)
OBJECT objXml;
OBJECT objRoot,objNode;
begin
set objXml = CreateObject("MSXML.DOMDocument");//创建一个DOM对象
if (IsObject(objXml) = FALSE ) then
MessageBox("出错,系统不支持使用DOM对象",SEVERE);
endif;
objXml.async = FALSE;
objXml.load(szFile);//加载原有XML文档
set objRoot = objXml.documentElement; //取根节点
//MessageBox(objRoot.xml,SEVERE); //输出所有节点测试
set objNode = objRoot.selectSingleNode("BOOK/TITLE");//查找TITLE节点
//MessageBox(objNode.text,SEVERE); //输出他的值
objNode.ParentNode.removeChild(objNode);//删除该节点
objXml.save(szFile); //保存
set objNode = NOTHING;
set objXml = NOTHING;
end;
//一些操作INI文本文件的函数
prototype CreateIni(STRING);
prototype ReadIni(STRING);
prototype SelectIni(STRING,STRING);
prototype InsertIni(STRING,STRING);
//创建INI配置文件
function CreateIni(szFile)
HWND file;//文件句柄
begin
OpenFileMode(FILE_MODE_APPEND); //打开方式 从末尾写入
CreateFile(file,"C://",szFile); //创建文件
WriteLine(file , "This is one line"); //写入一行
WriteLine(file , "This is two line");
CloseFile(file); //关闭文件
end;
//读取配置
function ReadIni(szFile)
HWND file;
STRING szLine;
begin
OpenFileMode(FILE_MODE_NORMAL); //打开方式 读取从头开始
OpenFile(file,"C://",szFile); //创建文件
GetLine(file,szLine);
MessageBox(szLine,SEVERE);
CloseFile(file); //关闭文件
end;
//查找某行
function SelectIni(szFile,Selectstr)
STRING szLine;
NUMBER szNum;
begin
OpenFileMode(FILE_MODE_NORMAL); //打开方式
FileGrep(szFile,Selectstr,szLine,szNum,RESTART);
//MessageBox(szLine,SEVERE);//弹出内容
return szNum; //返回行号
end;
//插入一行
function InsertIni(szFile,Selectstr)
NUMBER szNum ;
STRING str;
begin
szNum = SelectIni(szFile,Selectstr); //取行号
NumToStr(str,szNum);
MessageBox(str,SEVERE);//行号
FileInsertLine(szFile,"The Free Line",szNum,AFTER);
end;
//
//
// 改写文件属性,去掉只读或隐藏属性!(这是别人写的一个函数 保存在此)
//
/
export prototype ChangefileInfo(STRING);
function ChangefileInfo(FileNames)
STRING szFiles,szPath,svResult;
NUMBER nvResult;
begin
if (GetFileInfo(FileNames,FILE_ATTRIBUTE, nvResult, svResult)=0) then;
if (nvResult = FILE_ATTR_NORMAL) then
//do nothing;
else
if (FILE_ATTR_HIDDEN & nvResult) then
SetFileInfo (FileNames,FILE_ATTRIBUTE,FILE_ATTR_NORMAL,"");
endif;
if (FILE_ATTR_READONLY & nvResult) then
SetFileInfo (FileNames,FILE_ATTRIBUTE,FILE_ATTR_NORMAL,"");
endif;
endif;
endif;
end;
<网上找的一段代码,很有用>
InstallShield脚本中通常需要增加的内容
在开始复制文件之前的提示框里,显示给用户自己设置的内容以确认是一个不错的习惯。。。
ListAddString(listStartCopy, "目标路径:" + INSTALLDIR, AFTER);
ListAddString(listStartCopy, "", AFTER);
ListAddString(listStartCopy, "您选择了以下组件:", AFTER);
list = ListCreate(STRINGLIST);
FeatureListItems(MEDIA, "Services", list);
nResult = ListGetFirstString(list, svItem);
while (nResult != END_OF_LIST)
if FeatureIsItemSelected(MEDIA, svItem) then
FeatureGetData (MEDIA, svItem, FEATURE_FIELD_DISPLAYNAME, nvResult, svResult);
ListAddString(listStartCopy, " " + svResult, AFTER);
endif;
nResult = ListGetNextString(list, svItem);
endwhile;
ListDestroy(list);