2011-02-02 2 views
11

Inno 설치 중에 사용자로부터 수집 한 일부 정보를 POST를 통해 Google 서버에 제출하고 싶습니다.Inno 설치 스크립트에서 HTTP POST 요청

명백한 해결책은 설치 프로그램이 임시 위치로 추출하고 매개 변수를 사용하여 실행하는 .exe 파일을 포함하는 것입니다. 그러나 궁금한 점이 있습니다. 더 쉽고/좋은 방법이 있습니까?

+0

사용자 지정 .exe를 사용한 프로젝트 접근 방식에서 문제가 없습니다. – Sasha

답변

18

WinHttp 라이브러리 사용에 대한 jsobo 조언을 바탕으로,이 은 매우 트릭을 수행하는 간단한 코드와 함께 제공됩니다. 예를 들어, 실제 설치가 시작되기 바로 전에 확인을 위해 일련 번호를 보내려합니다. ,

procedure CurStepChanged(CurStep: TSetupStep); 
var 
    WinHttpReq: Variant; 
begin 
    if CurStep = ssInstall then 
    begin 
    if AutoCheckRadioButton.Checked = True then 
    begin 
     WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1'); 
     WinHttpReq.Open('POST', '<your_web_server>', false); 
     WinHttpReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
     WinHttpReq.Send('<your_data>'); 
     // WinHttpReq.ResponseText will hold the server response 
    end; 
    end; 
end; 

Open 방법은 인수로 HTTP 방식을 취하는 URL 및 비동기 요청을 할 수 있는지 그리고 우리가 application/x-www-form-urlencodedContent-Type 헤더를 설정하기 위해 SetRequestHeader를 추가해야 할 것 같다 : 코드 섹션에서 넣어 .

WinHttpReq.Status는 서버가 성공적으로 반환하면 이렇게 확인, 응답 코드를 개최한다 :

if WinHttpReq.Status <> 200 then 
begin 
    MsgBox('ERROR', mbError, MB_OK); 
end 
else 
begin 
    MsgBox('SUCCESS', mbInformation, MB_OK); 
end; 

http://msdn.microsoft.com/en-us/library/aa384106.aspx 목록 모든 방법과 WinHttpRequest 개체의 속성을.

또한 런타임 오류 (호스트에 도달 할 수없는 경우)가 발생하지 않도록하려면 try/except 코드로 코드를 묶는 것이 좋습니다.

+0

인터넷이 오프라인 (또는 서버) 인 경우 어떻게 처리합니까? WinHttpReq.Send throiws를 제외하고는/finally = ( – DuckQueen

3

을 ...

당신은 winhttp library

를 사용하는 호출을 할 권리 innosetup에 파스칼 스크립트를 작성할 수 있습니다 또는 당신은 단지 VBScript를을 작성하고 WinHTTP에 라이브러리를 통해 같은 HTTP 호출을 수행 할에서 cscript 엔진이를 실행할 수 있습니다.

최소한 3 가지 옵션이 필요합니다.

나는 exe를 넣는 것이 가장 오류가 발생하기 쉽지만 파스칼 스크립트 (innosetup이 사용하는)와 winhttp 라이브러리를 이용하는 것이 가장 간단하다고 생각한다.