2014-01-17 265 views
2

这是我的代码从user.upon输入端口号安装我想获取在Apache Tomcat server.xml文件中更改的端口号。如何将一个变量值传递给一个xml文件?

荫路过的Apache Tomcat的zip文件还使用文件部分和运行部分将它解压缩

var 
javaVersion: String; 
javaPath: String; 

//端口号码

function SetFocus(hWnd: HWND): HWND; 
external '[email protected] stdcall'; 

var 
SerialPage: TWizardPage; 
    SerialEdits: array of TEdit; 

const 
CF_TEXT = 1; 
VK_BACK = 8; 
SC_EDITCOUNT = 1; 
SC_CHARCOUNT = 4; 


    procedure OnSerialEditChange(Sender: TObject); 
var 
I: Integer; 
CanContinue: Boolean; 
begin 
CanContinue := True; 
for I := 0 to GetArrayLength(SerialEdits) - 1 do 
if Length(SerialEdits[I].Text) < SC_CHARCOUNT then 
begin 
    CanContinue := False; 
    Break; 
end; 
WizardForm.NextButton.Enabled := CanContinue; 
end; 

function GetSerialNumber(Param: String): string; 
    var 
    I: Integer; 
    begin 
    Result := ''; 
    for I := 0 to GetArrayLength(SerialEdits) - 1 do 
    Result := Result + SerialEdits[I].Text ; 
    end; 


procedure OnSerialEditKeyDown(Sender: TObject; var Key: Word; 
Shift: TShiftState); 
var 
    Edit: TEdit; 
    EditIndex: Integer; 
    begin 
    Edit := TEdit(Sender); 
    EditIndex := Edit.TabOrder - SerialEdits[0].TabOrder; 
if (EditIndex = 0) and (Key = Ord('V')) and (Shift = [ssCtrl]) then 
begin 
if TryPasteSerialNumber then 
    Key := 0; 
end 
else 
    if (Key >= 32) and (Key <= 255) then 
    begin 
    if Length(Edit.Text) = SC_CHARCOUNT - 1 then 
    begin 
    if EditIndex < GetArrayLength(SerialEdits) - 1 then 
    SetFocus(SerialEdits[EditIndex + 1].Handle) 
    else 
    SetFocus(WizardForm.NextButton.Handle); 
    end; 
    end 
    else 
    if Key = VK_BACK then 
    if (EditIndex > 0) and (Edit.Text = '') and (Edit.SelStart = 0) then 
    SetFocus(SerialEdits[EditIndex - 1].Handle); 
    end; 



procedure CreateSerialNumberPage; 
     var 
     I: Integer; 
     Edit: TEdit; 
     DescLabel: TLabel; 
     EditWidth: Integer; 
     begin 
      SerialPage := CreateCustomPage(wpWelcome, 'Serial number validation', 
'Enter the valid serial number'); 

DescLabel := TLabel.Create(SerialPage); 
DescLabel.Top := 16; 
DescLabel.Left := 0; 
DescLabel.Parent := SerialPage.Surface; 
DescLabel.Caption := 'Enter the valid serial number and continue with the installation...'; 
DescLabel.Font.Style := [fsBold]; 

SetArrayLength(SerialEdits, SC_EDITCOUNT); 
EditWidth := (SerialPage.SurfaceWidth - ((SC_EDITCOUNT - 1) * 8)) div SC_EDITCOUNT; 

for I := 0 to SC_EDITCOUNT - 1 do 
    begin 
Edit := TEdit.Create(SerialPage); 
Edit.Top := 40; 
Edit.Left := I * (EditWidth + 8); 
Edit.Width := EditWidth; 
Edit.CharCase := ecUpperCase; 
Edit.MaxLength := SC_CHARCOUNT; 
Edit.Parent := SerialPage.Surface; 
Edit.OnChange := @OnSerialEditChange; 
Edit.OnKeyDown := @OnSerialEditKeyDown; 
SerialEdits[I] := Edit; 
end; 
end; 


procedure CurPageChanged(CurPageID: Integer); 
begin 
if CurPageID = SerialPage.ID then 
WizardForm.NextButton.Enabled := False; 
end; 

procedure InitializeWizard; 
begin 
CreateSerialNumberPage; 
end ; 

我想,以取代被输入的端口号用户在tomcats server.xml中使用令牌

<Connector port="##portnumber##" protocol="HTTP/1.1" 
connectionTimeout="20000"   
redirectPort="8443" /> 
+0

您的XML文件使用哪种编码?这个XML文件有多复杂?你想从哪里得到那个'port'属性值的值?您的Pascal脚本代码在这里看起来相当不相关... – TLama

+0

用户输入一个端口号,并且该端口号应该在tomcat server.xml文件中被替换 – user2689808

+0

我的要求是用户应该在安装期间输入端口号并且应该更换输入的端口号server.xml文件(apache tomcat) – user2689808

回答

0

这是我制作的脚本 为你。我改变了输入端口号的方式,并展示了如何修改XML文件中的属性值。还请注意AfterInstall函数的用法:

#define TomcatDest "{app}\tomcat" 
#define TomcatFullPath TomcatDest + "\apache-tomcat-7.0.42" 
#define TomcatSrvConfigFile TomcatFullPath + "\conf\server.xml" 

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

[Files] 
Source: "unzip.exe"; DestDir: "{tmp}\installertemps" 
Source: "apache-tomcat-7.0.42.zip"; DestDir: "{tmp}\installertemps" 

[Run] 
Filename: "{tmp}\installertemps\unzip.exe"; Parameters: " ""{tmp}\installertemps\apache-tomcat-7.0.42.zip"" -d ""{#TomcatDest}"" "; AfterInstall: UpdateConfigFile(ExpandConstant('{#TomcatSrvConfigFile}')) 

[Code] 
const 
    DefaultPort = 8080; 
var 
    ConfigPage: TInputQueryWizardPage; 

procedure SaveAttrValueToXML(const FileName, NodePath, Attribute, 
    Value: string); 
var 
    XMLNode: Variant; 
    XMLDocument: Variant; 
begin 
    XMLDocument := CreateOleObject('Msxml2.DOMDocument'); 
    try 
    XMLDocument.async := False; 
    XMLDocument.load(FileName); 
    if (XMLDocument.parseError.errorCode <> 0) then 
     MsgBox('The XML file could not be parsed. ' + 
     XMLDocument.parseError.reason, mbError, MB_OK) 
    else 
    begin 
     XMLDocument.setProperty('SelectionLanguage', 'XPath'); 
     XMLNode := XMLDocument.selectSingleNode(NodePath); 
     XMLNode.setAttribute(Attribute, Value); 
     XMLDocument.save(FileName); 
    end; 
    except 
    MsgBox('An error occured!' + #13#10 + GetExceptionMessage, 
     mbError, MB_OK); 
    end; 
end; 

procedure InitializeWizard; 
begin 
    ConfigPage := CreateInputQueryPage(wpSelectDir, 'Tomcat configuration', 
    'Description', 'SubCaption'); 
    ConfigPage.Add('Port:', False); 
    ConfigPage.Values[0] := IntToStr(DefaultPort); 
end; 

function NextButtonClick(CurPageID: Integer): Boolean; 
var 
    PortNumber: Integer; 
begin 
    Result := True; 
    if CurPageID = ConfigPage.ID then 
    begin 
    PortNumber := StrToIntDef(ConfigPage.Values[0], -1); 
    // modify the statement to allow users enter only valid port numbers; 
    // currently the value of -1 means that there is not even a number entered 
    // in the edit box 
    if (PortNumber = -1) then 
    begin 
     Result := False; 
     MsgBox('You''ve entered invalid port number. The setup cannot continue...', mbError, MB_OK); 
    end; 
    end; 
end; 

procedure UpdateConfigFile(const FileName: string); 
begin 
    SaveAttrValueToXML(FileName, '//Server/Service/Connector', 'port', 
    ConfigPage.Values[0]); 
end; 
+0

这个脚本并不在意清理从档案中提取的内容。不关心检查Tomcat是否已经安装,等等。 – TLama

+0

非常感谢你为此付出宝贵的时间。请问你可以建议任何网站学习inno设置编码。 – user2689808

+0

不客气!关于学习网站......我想,其中没有太多。一个['漂亮的网站'](http://www.mirality.co.nz/inno/tips.php)由['Miral']编写(http://stackoverflow.com/users/43534/miral)。 – TLama

相关问题