1f190833

Но просто передать значения Result


procedure CreateServerVariables (RequestInfo:TIdHttpRequestInfo;var Result:TStringList); begin if not Assigned (Result) then Result:=TStringList.Create; Result.Add ('HTTP_HOST='+RequestInfo.Host); Result.Add ('REQUEST_METHOD='+RequestInfo.Command); Result.Add ('URL='+RequestInfo.Document); Result.Add ('QUERY_STRING='+RequestInfo.UnparsedParams); Result.Add ('REMOTE_ADDR='+RequestInfo.RemoteIP); Result.Add ('HTTP_ACCEPT='+RequestInfo.Headers.Values ['Accept']); Result.Add ('HTTP_USER_AGENT='+RequestInfo.Headers.Values ['User-Agent']); Result.Add ('SERVER_PROTOCOL='+sServerProtocol); Result.Add ('SERVER_SOFTWARE='+sServerSoftware); end; Но просто передать значения Result в CreateProcess нельзя - для этого используем еще одну сервисную функцию:

function FormEnv (Data:TStringList):String; var i:integer; begin Result:=''; if Data<>nil then begin For i:=0 to Data.Count-1 do Result:=Result+Data [i]+#0; Result:=Result+#0; end; end; Нам осталось сделать переадресацию со стандартного устройства вывода в наш файл и запустить приложение:

function RunCGI (Command:PChar;Data:TStrings):PChar; var FS:TFileStream; SI:TStartupInfo; PI:TProcessInformation; SL:TStringList; Env:Pointer; EnvStr:String; begin Result:=PChar (sNoErrorNoResult); FS:=TFilestream.Create (ExtractFileDir (ParamStr (0))+'\temp.html',fmCreate); try FillChar (SI,SizeOf (SI),0); SI.cb:=SizeOf (SI); SI.dwFlags:=STARTF_USESTDHANDLES; SI.hStdOutput:=FS.Handle; SI.hStdInput:=GetStdHandle (STD_INPUT_HANDLE); SI.hStdError:=GetStdHandle (STD_ERROR_HANDLE); EnvStr:=FormEnv (Data); if not CreateProcess (Command,'',nil,nil,False, CREATE_NEW_PROCESS_GROUP or DETACHED_PROCESS,Pointer (EnvStr),PChar (ExtractFileDir (ParamStr (0))),SI,PI) then Result:=PChar (sCGIStartError) else begin if WaitForSingleObject (PI.hThread,5000)=WAIT_FAILED then begin Result:=PChar (sTimeoutError); exit; end; SL:=TStringList.Create; try FS.Position:=0; SL.LoadFromStream (FS); Result:=PChar (SL.Text); finally SL.Free; end; end; finally FS.Free; if FileExists (ExtractFileDir (ParamStr (0))+'\temp.html') then DeleteFile (ExtractFileDir (ParamStr (0))+'\temp.html'); end; end; Порядок работы:

  • сначала мы создаем файл (temp.html), в который будем переадресовывать информацию из приложения, и обнуляем переменную SI;
  • заполняем необходимые поля SI;
  • заполняем строку с переменными окружения;
  • запускаем наш CGI;
  • ждем конца выполнения (5 с);
  • передаем результат выполнения в SL, а тот, в свою очередь,- в переменную Result;
  • удаляем файл temp.html.
После выполнения этой функции возвращаемое значение передаем в ResponseInfo.ContentText.


Начало  Назад  Вперед