--- Received from FPU.WHITES1 799 3703                       21-12-01 11:44       
----------------

  -> [EMAIL PROTECTED]
  -> [EMAIL PROTECTED]

I'm not familiar with the THandleStream (I guess you're using Borland...?) but doesn't 
it allow
you to send data straight to the stream?  All your attempts are aimed at talking to php
externally.

Does THandleStream provide something that will let you do:

InStream->Write("0x1A");

...or is the InStream automatically closing when the pipe data finishes.

I'd be much more inclined to insert this into the same pipe rather than coming at it 
from the
outside (which probably won't work anyway now you've redirected stdin/stdout).

Alternatively you could just write an intermediate proxy executable that takes charge 
of talking
to PHP and can add the CTRLZ itself:

YourProg--[data]-->proxy--[data+CTRLZ]-->PHP

-Steve


From: [EMAIL PROTECTED]
To: [EMAIL PROTECTED]
Date: Fri, 21 Dec 2001 12:33:30 +0100
Subject: [PHP-WIN] Send CTRL + Z ( EOF ) key to a PHP (console) program created with 
CreateProcess

Hi to all,
I've a question to ask you.

I've do a function which interface PHP.EXE and redirect the stdin / stdout
so I can pass it a TMemoryStream object with stdin and I receive a
TMemoryStream
with stdout. All is done with a console program in which I launch the
PHP.EXE
between the CreateProcess API. The process is hidden so you don't see
never...

At this point I've a problem.
The Pipe don't pass the EOF (CTRL + Z) char to PHP.EXE stdin so I don't able
to inform PHP.EXE of end of my input stdin sequence.

What I must do to do that ?

Follow a snapshot of my C++ code....

Thank you very much....
Silverio Diquigiovanni


bool __fastcall RunPHP(TStream *Input, TStream *Output)

  bool Result = false;

  // sets security informations
  SECURITY_DESCRIPTOR sd;
  SECURITY_ATTRIBUTES sa;
  LPSECURITY_ATTRIBUTES lpsa = NULL;

  if (IsWindowsNT())
  {
    InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(&sd, true, NULL, false);
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = true;
    sa.lpSecurityDescriptor = &sd;
    lpsa = &sa;
  }

  // creates & checks stdin pipe
  HANDLE h_IN_ReadPipe;
  HANDLE h_IN_WritePipe;

  assert(CreatePipe(&h_IN_ReadPipe, &h_IN_WritePipe, lpsa, 0));

  // creates & checks stdout pie
  HANDLE h_OUT_ReadPipe;
  HANDLE h_OUT_WritePipe;

  assert(CreatePipe(&h_OUT_ReadPipe, &h_OUT_WritePipe, lpsa, 0));

  // sets process informations
  STARTUPINFO si;
  PROCESS_INFORMATION pi;

  memset(&si, 0, sizeof (STARTUPINFO));
  si.cb = sizeof(STARTUPINFO);
  si.dwFlags = STARTF_USESHOWWINDOW |STARTF_USESTDHANDLES;
  si.wShowWindow = SW_SHOW;
  si.wShowWindow = SW_HIDE;
  si.hStdInput = h_IN_ReadPipe;
  si.hStdOutput = h_OUT_WritePipe;
  si.hStdError = h_OUT_WritePipe;

  // creates process
  bool process_run = CreateProcess
  (
    NULL,
    "PHP.EXE",
    NULL,
    NULL,
    TRUE,
    0,
    0,
    0,
    &si,
    &pi
  );

  // checks process running
  if (process_run)
  {
    THandleStream *InStream = new THandleStream((int) h_IN_WritePipe);

    Input->Position = 0;
    InStream->CopyFrom(Input, Input->Size);

    //
    // Here I must send the CTRL + Z to the PHP.EXE but I don't know how....
    //

/*  tentative n.1: no good :(
    TerminateProcess(pi.hProcess, 0x1a);
*/

/*  tentative n.2: no good :(
    HWND CalledHandle = FindWindow(NULL, "PHP");
    SendMessage(CalledHandle, 0x0501, 0x1, 0x010d86a4);
*/

/*  tentative n.3: no good :(
    HWND CalledHandle = FindWindow(NULL, "PHP");
    bool b_ok = BringWindowToTop(CalledHandle);
    keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
    keybd_event('Z', MapVirtualKey('Z', 0), 0, 0);
    keybd_event('Z', MapVirtualKey('Z', 0), KEYEVENTF_KEYUP, 0);
    keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP,
0);

    // Xxx...
    WaitForSingleObject(pi.hProcess, INFINITE);

    // Xxx...
    DWORD BytesRead;
    char Buffer[1024];
    while (1)
    {
      memset(Buffer, 0, sizeof (Buffer));
      assert
      (
        ReadFile
        (
          h_OUT_ReadPipe,
          &Buffer,
          sizeof (Buffer),
          &BytesRead,
          NULL
        )
      );
      Output->Write(Buffer, BytesRead);
      if (BytesRead < 1024)
        break;
    }
    Result = true;

    // frees objects
    delete InStream;
    CloseHandle(pi.hProcess);
  }

  // frees objects
  CloseHandle(h_IN_ReadPipe);
  CloseHandle(h_IN_WritePipe);
  CloseHandle(h_OUT_ReadPipe);
  CloseHandle(h_OUT_WritePipe);

  return Result;


/***************************************************************************
****
 *  Event handler method

****************************************************************************
***/

void __fastcall TDesktop::RunPHPClick(TObject *Sender)

  // creates PHPCode & HTMLCode
  TMemoryStream *PHPCode = new TMemoryStream;
  TMemoryStream *HTMLCode = new TMemoryStream;

  // creates a little PHP script flow
  AnsiString s =
  (
    "<?php"                                   + CRLF +
    "echo (\"<br>\n\");"                      + CRLF +
    "for ($a = 1; $a < 6; $a++)"              + CRLF +
    "{"                                       + CRLF +
    "echo (\"Ciao per la $a volta <br>\n\");" + CRLF +
    "}"                                       + CRLF +
    "exit;"                                   + CRLF +
    "?>"                                      + CRLF
  );

  PHPCode->Write(s.c_str(), s.Length());

  // calls & checks PHP html generator
  if(::RunPHP(PHPCode, HTMLCode) == true)
  {
    HTMLCode->SaveToFile("C:\\index.html");
    WebBrowser->Navigate((WideString) "C:\\index.html");
  }

  // frees objects
  delete PHPCode;
  delete HTMLCode;



--
PHP Windows Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

This e-mail may contain confidential information and/or copyright
material. This e-mail is intended for the use of the addressee
only. Any unauthorised use may be unlawful.

If you receive this e-mail by mistake please advise the sender
immediately by using the reply facility in your e-mail software.

Friends Provident Marketing Group consists of the following
companies:

Friends Provident Life and Pensions Limited.
Registered number 4096141.
Friends' Provident Unit Trust Managers Limited.
Registered number 970641
FP Life Assurance Limited.
Registered number 782698
Friends Provident Pensions Limited.
Registered number 475201
Friends Ivory & Sime Managed Pensions Funds Limited.
Registered number 1020044
Registered and Head Office of each of the above companies is at Pixham End,
Dorking, Surrey RH4 1QA.
Registered in England. Incorporated companies limited by shares.
Ivory & Sime Trustlink Limited. Registered number 151198
Registered and Head Office: One Charlotte Square, Edinburgh EH2
4DZ.  Registered in Scotland. Incorporated company limited by
shares.

Companies within this Group transact life assurance, pension,
permanent health, unit trust and investment trust business

All are regulated by the Financial Services Authority.

--
PHP Windows Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to