2014-01-17 264 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

相關問題