2013-03-25 6 views
5

Ho un servizio WCF che sto ospitando come servizio Windows. Normalmente vado al prompt dei comandi VS e installo il servizio usando installutil.exe, quindi modifica l'indirizzo di base del servizio in app.config in base al nome del computer su cui lo sto installando ed eseguo il servizio.Inno Setup Modifica il file app.config quando si esegue setup.exe

indirizzo di base è questa:

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

modifico il MACHINE_NAME nel file app.config.

Voglio usare inno setup per fare lo stesso per me.

Quello che voglio è quando l'utente esegue il file setup.exe per installare il servizio, voglio chiedere all'utente l'indirizzo di base del servizio e usare quell'indirizzo per ospitarlo. Non sono in grado di capire se è possibile O come farlo.

Qualsiasi aiuto per favore? Grazie in anticipo. :)

risposta

5

Solo un esempio che uso per sostituire la stringa nella configurazione della mia app.
Sono sicuro che si può fare meglio :-)

Quello che mi sostituisco è:

add key = valore "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

Sì, ad esempio utilizzando un parser XML. Se hai familiarità con MSXML, potresti seguire ['questo post'] (http://stackoverflow.com/a/11254218/960757). È abbastanza semplice estenderlo alle tue esigenze. Un parser XML veloce per InnoSetup è presente nell'elenco delle mie attività (ma richiederà del tempo). – TLama

+1

Un parser/scrittore XML è una complicazione inutile se si dispone di una stringa di marcatore univoca nota in un file modello che è possibile sostituire (simile al codice precedente). Tuttavia, è una buona idea se è necessario essere in grado di modificare i file in cui non è possibile inserire tali marcatori (ad esempio se è necessario aggiornare un file già installato sul sistema dell'utente). Si noti tuttavia che il codice sopra ha un bug: 'DateTime' viene trattato come un valore ISPP invece di una funzione di codice. Dovrebbe essere chiamato direttamente, non tramite 'ExpandConstant'. – Miral

+0

corretto. Grazie per il consiglio. – RobeN

2

I ti consigliamo di utilizzare il parser XML per aggiornare i tuoi file di configurazione. La seguente funzione può esserti d'aiuto. Utilizza MSXML come parser di file:

[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

Posso aiutarti con il resto dei tuoi requisiti (creare una pagina di input prima che l'installazione inizi a consentire all'utente di inserire l'indirizzo dell'endpoint e chiamare la funzione sopra riportata dopo l'installazione riuscita), se necessario. Fammi solo sapere ... – TLama

+0

Wow .. ci proverò ... grazie mille ...: D – Newbee

+0

Come va? Ogni recensione sarà apprezzata ;-) – TLama