2013-03-25 210 views
5

我有一個WCF服務,我作爲Windows服務託管。我通常會轉到VS命令提示符並使用installutil.exe安裝服務,然後根據我正在安裝它的計算機名稱修改app.config中服務的基本地址並運行服務。Inno Setup當您運行setup.exe時修改app.config文件

基址是這樣的:

<endpoint address="http://MACHINE_NAME/NFCReader/" binding="webHttpBinding"/> 

我修改app.config文件中MACHINE_NAME。

我想用inno setup來爲我做同樣的事情。

我想要的是,當用戶運行setup.exe文件來安裝服務時,我想提示用戶輸入服務的基地址並使用該地址來承載它。我無法弄清楚是否有可能或如何去做。

請幫忙嗎?提前致謝。 :)

回答

5

只是一個例子,我用我的應用程序配置替換字符串。
我敢肯定,這是可以做到:-)

好我取而代之的是:

添加鍵= 「AppVersion」 值= 「YYMMDD.HH.MM」

[Code] 
procedure Update; 
var 
C: AnsiString; 
CU: String; 
begin 
     LoadStringFromFile(ExpandConstant('{src}\CdpDownloader.exe_base.config'), C); 
     CU := C; 
     StringChange(CU, 'YYMMDD.HH.MM', GetDateTimeString('yymmdd/hh:nn', '.', '.')); 
     C := CU; 
     SaveStringToFile(ExpandConstant('{src}\Config\CdpDownloader.exe.config'), C, False);   
end; 

function InitializeSetup: Boolean; 
begin 
    Update; 
result := True; 
end; 
+1

是的,例如通過使用XML解析器。如果你熟悉MSXML,你可以按照['這篇文章'](http://stackoverflow.com/a/11254218/960757)。將它擴展到您的需求非常簡單。 InnoSetup的快速XML解析器位於我的任務列表中(但需要一些時間)。 – TLama 2013-03-25 15:07:32

+1

如果在可替換的模板文件中具有已知唯一標記字符串(類似於上面的代碼),則XML解析器/寫入器是不必要的複雜操作。但是,如果您需要修改不能插入這些標記的文件(例如,如果需要更新已安裝在用戶系統上的文件),那麼這是一個好主意。但請注意,上面的代碼有一個錯誤:「DateTime」被視爲ISPP值而不是代碼函數。它應該直接調用,而不是通過'ExpandConstant'。 – Miral 2013-03-26 20:05:35

+0

更正。謝謝你的提示。 – RobeN 2013-03-27 09:00:04

2

我會建議您使用XML解析器來更新您的配置文件。以下功能可以幫助您。它使用MSXML作爲文件解析器:

[Code] 
const 
    ConfigEndpointPath = '//configuration/system.serviceModel/client/endpoint'; 

function ChangeEndpointAddress(const FileName, Address: string): Boolean; 
var 
    XMLNode: Variant; 
    XMLDocument: Variant; 
begin 
    Result := False; 
    XMLDocument := CreateOleObject('Msxml2.DOMDocument.6.0'); 
    try 
    XMLDocument.async := False; 
    XMLDocument.preserveWhiteSpace := True; 
    XMLDocument.load(FileName);  
    if (XMLDocument.parseError.errorCode <> 0) then 
     RaiseException(XMLDocument.parseError.reason) 
    else 
    begin 
     XMLDocument.setProperty('SelectionLanguage', 'XPath'); 
     XMLNode := XMLDocument.selectSingleNode(ConfigEndpointPath); 
     XMLNode.setAttribute('address', Address); 
     XMLDocument.save(FileName); 
     Result := True; 
    end; 
    except 
    MsgBox('An error occured during processing application ' + 
     'config file!' + #13#10 + GetExceptionMessage, mbError, MB_OK); 
    end; 
end; 
+2

我可以幫助您滿足您的其他需求(如果需要,我們可以在安裝開始前創建一個輸入頁面,讓用戶輸入終端地址並在安裝成功後調用上述功能)。只是讓我知道... – TLama 2013-03-25 18:18:33

+0

哇..米會嘗試...非常感謝你...:D – Newbee 2013-03-25 18:43:23

+0

它是怎麼回事?任何反饋將不勝感激;-) – TLama 2013-05-10 08:56:40